langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java
author vromero
Tue, 25 Jun 2013 16:12:53 +0100
changeset 18646 e628560a86d1
parent 18389 a425d0819f36
child 19126 20123a84b35a
permissions -rw-r--r--
8017104: javac should have a class for primitive types that inherits from Type Reviewed-by: jjg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10
06bc494ca11e Initial load
duke
parents:
diff changeset
     1
/*
15355
a4757c33cae9 7193719: Support repeating annotations in javax.lang.model
jfranck
parents: 15031
diff changeset
     2
 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
06bc494ca11e Initial load
duke
parents:
diff changeset
     4
 *
06bc494ca11e Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
06bc494ca11e Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5520
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 5321
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
10
06bc494ca11e Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5520
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 5321
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    10
 *
06bc494ca11e Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
06bc494ca11e Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
06bc494ca11e Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
06bc494ca11e Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
06bc494ca11e Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
06bc494ca11e Initial load
duke
parents:
diff changeset
    16
 *
06bc494ca11e Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
06bc494ca11e Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
06bc494ca11e Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
06bc494ca11e Initial load
duke
parents:
diff changeset
    20
 *
5520
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 5321
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 5321
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 5321
diff changeset
    23
 * questions.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    24
 */
06bc494ca11e Initial load
duke
parents:
diff changeset
    25
06bc494ca11e Initial load
duke
parents:
diff changeset
    26
package com.sun.tools.javac.code;
06bc494ca11e Initial load
duke
parents:
diff changeset
    27
06bc494ca11e Initial load
duke
parents:
diff changeset
    28
import java.util.Set;
06bc494ca11e Initial load
duke
parents:
diff changeset
    29
import java.util.concurrent.Callable;
14258
8d2148961366 8000663: clean up langtools imports
jjg
parents: 14062
diff changeset
    30
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    31
import javax.lang.model.element.*;
06bc494ca11e Initial load
duke
parents:
diff changeset
    32
import javax.tools.JavaFileObject;
06bc494ca11e Initial load
duke
parents:
diff changeset
    33
06bc494ca11e Initial load
duke
parents:
diff changeset
    34
import com.sun.tools.javac.code.Type.*;
18010
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
    35
import com.sun.tools.javac.comp.Annotate;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    36
import com.sun.tools.javac.comp.Attr;
06bc494ca11e Initial load
duke
parents:
diff changeset
    37
import com.sun.tools.javac.comp.AttrContext;
06bc494ca11e Initial load
duke
parents:
diff changeset
    38
import com.sun.tools.javac.comp.Env;
06bc494ca11e Initial load
duke
parents:
diff changeset
    39
import com.sun.tools.javac.jvm.*;
06bc494ca11e Initial load
duke
parents:
diff changeset
    40
import com.sun.tools.javac.model.*;
06bc494ca11e Initial load
duke
parents:
diff changeset
    41
import com.sun.tools.javac.tree.JCTree;
14258
8d2148961366 8000663: clean up langtools imports
jjg
parents: 14062
diff changeset
    42
import com.sun.tools.javac.util.*;
8d2148961366 8000663: clean up langtools imports
jjg
parents: 14062
diff changeset
    43
import com.sun.tools.javac.util.Name;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    44
import static com.sun.tools.javac.code.Flags.*;
06bc494ca11e Initial load
duke
parents:
diff changeset
    45
import static com.sun.tools.javac.code.Kinds.*;
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
    46
import static com.sun.tools.javac.code.TypeTag.CLASS;
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
    47
import static com.sun.tools.javac.code.TypeTag.FORALL;
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
    48
import static com.sun.tools.javac.code.TypeTag.TYPEVAR;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    49
06bc494ca11e Initial load
duke
parents:
diff changeset
    50
/** Root class for Java symbols. It contains subclasses
06bc494ca11e Initial load
duke
parents:
diff changeset
    51
 *  for specific sorts of symbols, such as variables, methods and operators,
06bc494ca11e Initial load
duke
parents:
diff changeset
    52
 *  types, packages. Each subclass is represented as a static inner class
06bc494ca11e Initial load
duke
parents:
diff changeset
    53
 *  inside Symbol.
06bc494ca11e Initial load
duke
parents:
diff changeset
    54
 *
5847
1908176fd6e3 6944312: Potential rebranding issues in openjdk/langtools repository sources
jjg
parents: 5520
diff changeset
    55
 *  <p><b>This is NOT part of any supported API.
1908176fd6e3 6944312: Potential rebranding issues in openjdk/langtools repository sources
jjg
parents: 5520
diff changeset
    56
 *  If you write code that depends on this, you do so at your own risk.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    57
 *  This code and its internal interfaces are subject to change or
06bc494ca11e Initial load
duke
parents:
diff changeset
    58
 *  deletion without notice.</b>
06bc494ca11e Initial load
duke
parents:
diff changeset
    59
 */
06bc494ca11e Initial load
duke
parents:
diff changeset
    60
public abstract class Symbol implements Element {
06bc494ca11e Initial load
duke
parents:
diff changeset
    61
    // public Throwable debug = new Throwable();
06bc494ca11e Initial load
duke
parents:
diff changeset
    62
06bc494ca11e Initial load
duke
parents:
diff changeset
    63
    /** The kind of this symbol.
06bc494ca11e Initial load
duke
parents:
diff changeset
    64
     *  @see Kinds
06bc494ca11e Initial load
duke
parents:
diff changeset
    65
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    66
    public int kind;
06bc494ca11e Initial load
duke
parents:
diff changeset
    67
06bc494ca11e Initial load
duke
parents:
diff changeset
    68
    /** The flags of this symbol.
06bc494ca11e Initial load
duke
parents:
diff changeset
    69
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    70
    public long flags_field;
06bc494ca11e Initial load
duke
parents:
diff changeset
    71
06bc494ca11e Initial load
duke
parents:
diff changeset
    72
    /** An accessor method for the flags of this symbol.
06bc494ca11e Initial load
duke
parents:
diff changeset
    73
     *  Flags of class symbols should be accessed through the accessor
06bc494ca11e Initial load
duke
parents:
diff changeset
    74
     *  method to make sure that the class symbol is loaded.
06bc494ca11e Initial load
duke
parents:
diff changeset
    75
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    76
    public long flags() { return flags_field; }
06bc494ca11e Initial load
duke
parents:
diff changeset
    77
06bc494ca11e Initial load
duke
parents:
diff changeset
    78
    /** The name of this symbol in Utf8 representation.
06bc494ca11e Initial load
duke
parents:
diff changeset
    79
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    80
    public Name name;
06bc494ca11e Initial load
duke
parents:
diff changeset
    81
06bc494ca11e Initial load
duke
parents:
diff changeset
    82
    /** The type of this symbol.
06bc494ca11e Initial load
duke
parents:
diff changeset
    83
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    84
    public Type type;
06bc494ca11e Initial load
duke
parents:
diff changeset
    85
06bc494ca11e Initial load
duke
parents:
diff changeset
    86
    /** The owner of this symbol.
06bc494ca11e Initial load
duke
parents:
diff changeset
    87
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    88
    public Symbol owner;
06bc494ca11e Initial load
duke
parents:
diff changeset
    89
06bc494ca11e Initial load
duke
parents:
diff changeset
    90
    /** The completer of this symbol.
06bc494ca11e Initial load
duke
parents:
diff changeset
    91
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    92
    public Completer completer;
06bc494ca11e Initial load
duke
parents:
diff changeset
    93
06bc494ca11e Initial load
duke
parents:
diff changeset
    94
    /** A cache for the type erasure of this symbol.
06bc494ca11e Initial load
duke
parents:
diff changeset
    95
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    96
    public Type erasure_field;
06bc494ca11e Initial load
duke
parents:
diff changeset
    97
18010
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
    98
    // <editor-fold defaultstate="collapsed" desc="annotations">
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
    99
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   100
    /** The attributes of this symbol are contained in this
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   101
     * Annotations. The Annotations instance is NOT immutable.
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   102
     */
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   103
    protected Annotations annotations;
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   104
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   105
    /** An accessor method for the attributes of this symbol.
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   106
     *  Attributes of class symbols should be accessed through the accessor
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   107
     *  method to make sure that the class symbol is loaded.
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   108
     */
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   109
    public List<Attribute.Compound> getRawAttributes() {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   110
        return (annotations == null)
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   111
                ? List.<Attribute.Compound>nil()
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   112
                : annotations.getDeclarationAttributes();
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   113
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   114
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   115
    /** An accessor method for the type attributes of this symbol.
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   116
     *  Attributes of class symbols should be accessed through the accessor
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   117
     *  method to make sure that the class symbol is loaded.
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   118
     */
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   119
    public List<Attribute.TypeCompound> getRawTypeAttributes() {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   120
        return (annotations == null)
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   121
                ? List.<Attribute.TypeCompound>nil()
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   122
                : annotations.getTypeAttributes();
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   123
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   124
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   125
    /** Fetch a particular annotation from a symbol. */
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   126
    public Attribute.Compound attribute(Symbol anno) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   127
        for (Attribute.Compound a : getRawAttributes()) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   128
            if (a.type.tsym == anno) return a;
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   129
        }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   130
        return null;
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   131
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   132
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   133
    public boolean annotationsPendingCompletion() {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   134
        return annotations == null ? false : annotations.pendingCompletion();
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   135
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   136
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   137
    public void appendAttributes(List<Attribute.Compound> l) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   138
        if (l.nonEmpty()) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   139
            initedAnnos().append(l);
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   140
        }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   141
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   142
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   143
    public void appendClassInitTypeAttributes(List<Attribute.TypeCompound> l) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   144
        if (l.nonEmpty()) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   145
            initedAnnos().appendClassInitTypeAttributes(l);
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   146
        }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   147
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   148
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   149
    public void appendInitTypeAttributes(List<Attribute.TypeCompound> l) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   150
        if (l.nonEmpty()) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   151
            initedAnnos().appendInitTypeAttributes(l);
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   152
        }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   153
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   154
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   155
    public void appendTypeAttributesWithCompletion(final Annotate.AnnotateRepeatedContext<Attribute.TypeCompound> ctx) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   156
        initedAnnos().appendTypeAttributesWithCompletion(ctx);
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   157
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   158
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   159
    public void appendUniqueTypeAttributes(List<Attribute.TypeCompound> l) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   160
        if (l.nonEmpty()) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   161
            initedAnnos().appendUniqueTypes(l);
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   162
        }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   163
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   164
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   165
    public List<Attribute.TypeCompound> getClassInitTypeAttributes() {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   166
        return (annotations == null)
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   167
                ? List.<Attribute.TypeCompound>nil()
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   168
                : annotations.getClassInitTypeAttributes();
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   169
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   170
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   171
    public List<Attribute.TypeCompound> getInitTypeAttributes() {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   172
        return (annotations == null)
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   173
                ? List.<Attribute.TypeCompound>nil()
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   174
                : annotations.getInitTypeAttributes();
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   175
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   176
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   177
    public List<Attribute.Compound> getDeclarationAttributes() {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   178
        return (annotations == null)
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   179
                ? List.<Attribute.Compound>nil()
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   180
                : annotations.getDeclarationAttributes();
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   181
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   182
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   183
    public boolean hasAnnotations() {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   184
        return (annotations != null && !annotations.isEmpty());
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   185
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   186
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   187
    public boolean hasTypeAnnotations() {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   188
        return (annotations != null && !annotations.isTypesEmpty());
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   189
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   190
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   191
    public void prependAttributes(List<Attribute.Compound> l) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   192
        if (l.nonEmpty()) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   193
            initedAnnos().prepend(l);
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   194
        }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   195
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   196
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   197
    public void resetAnnotations() {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   198
        initedAnnos().reset();
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   199
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   200
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   201
    public void setAttributes(Symbol other) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   202
        if (annotations != null || other.annotations != null) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   203
            initedAnnos().setAttributes(other.annotations);
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   204
        }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   205
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   206
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   207
    public void setDeclarationAttributes(List<Attribute.Compound> a) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   208
        if (annotations != null || a.nonEmpty()) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   209
            initedAnnos().setDeclarationAttributes(a);
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   210
        }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   211
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   212
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   213
    public void setDeclarationAttributesWithCompletion(final Annotate.AnnotateRepeatedContext<Attribute.Compound> ctx) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   214
        initedAnnos().setDeclarationAttributesWithCompletion(ctx);
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   215
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   216
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   217
    public void setTypeAttributes(List<Attribute.TypeCompound> a) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   218
        if (annotations != null || a.nonEmpty()) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   219
            if (annotations == null)
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   220
                annotations = new Annotations(this);
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   221
            annotations.setTypeAttributes(a);
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   222
        }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   223
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   224
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   225
    private Annotations initedAnnos() {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   226
        if (annotations == null)
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   227
            annotations = new Annotations(this);
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   228
        return annotations;
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   229
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   230
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   231
    /** This method is intended for debugging only. */
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   232
    public Annotations getAnnotations() {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   233
        return annotations;
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   234
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   235
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   236
    // </editor-fold>
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   237
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   238
    /** Construct a symbol with given kind, flags, name, type and owner.
06bc494ca11e Initial load
duke
parents:
diff changeset
   239
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   240
    public Symbol(int kind, long flags, Name name, Type type, Symbol owner) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   241
        this.kind = kind;
06bc494ca11e Initial load
duke
parents:
diff changeset
   242
        this.flags_field = flags;
06bc494ca11e Initial load
duke
parents:
diff changeset
   243
        this.type = type;
06bc494ca11e Initial load
duke
parents:
diff changeset
   244
        this.owner = owner;
06bc494ca11e Initial load
duke
parents:
diff changeset
   245
        this.completer = null;
06bc494ca11e Initial load
duke
parents:
diff changeset
   246
        this.erasure_field = null;
06bc494ca11e Initial load
duke
parents:
diff changeset
   247
        this.name = name;
06bc494ca11e Initial load
duke
parents:
diff changeset
   248
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   249
06bc494ca11e Initial load
duke
parents:
diff changeset
   250
    /** Clone this symbol with new owner.
06bc494ca11e Initial load
duke
parents:
diff changeset
   251
     *  Legal only for fields and methods.
06bc494ca11e Initial load
duke
parents:
diff changeset
   252
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   253
    public Symbol clone(Symbol newOwner) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   254
        throw new AssertionError();
06bc494ca11e Initial load
duke
parents:
diff changeset
   255
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   256
1357
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   257
    public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   258
        return v.visitSymbol(this, p);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   259
    }
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   260
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   261
    /** The Java source which this symbol represents.
06bc494ca11e Initial load
duke
parents:
diff changeset
   262
     *  A description of this symbol; overrides Object.
06bc494ca11e Initial load
duke
parents:
diff changeset
   263
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   264
    public String toString() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   265
        return name.toString();
06bc494ca11e Initial load
duke
parents:
diff changeset
   266
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   267
06bc494ca11e Initial load
duke
parents:
diff changeset
   268
    /** A Java source description of the location of this symbol; used for
939
38e24969c7e9 6717241: some diagnostic argument is prematurely converted into a String object
mcimadamore
parents: 735
diff changeset
   269
     *  error reporting.
38e24969c7e9 6717241: some diagnostic argument is prematurely converted into a String object
mcimadamore
parents: 735
diff changeset
   270
     *
38e24969c7e9 6717241: some diagnostic argument is prematurely converted into a String object
mcimadamore
parents: 735
diff changeset
   271
     * @return null if the symbol is a package or a toplevel class defined in
38e24969c7e9 6717241: some diagnostic argument is prematurely converted into a String object
mcimadamore
parents: 735
diff changeset
   272
     * the default package; otherwise, the owner symbol is returned
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   273
     */
939
38e24969c7e9 6717241: some diagnostic argument is prematurely converted into a String object
mcimadamore
parents: 735
diff changeset
   274
    public Symbol location() {
10626
83f0c2860f5b 7086595: Error message bug: name of initializer is 'null'
mcimadamore
parents: 9812
diff changeset
   275
        if (owner.name == null || (owner.name.isEmpty() &&
83f0c2860f5b 7086595: Error message bug: name of initializer is 'null'
mcimadamore
parents: 9812
diff changeset
   276
                (owner.flags() & BLOCK) == 0 && owner.kind != PCK && owner.kind != TYP)) {
939
38e24969c7e9 6717241: some diagnostic argument is prematurely converted into a String object
mcimadamore
parents: 735
diff changeset
   277
            return null;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   278
        }
939
38e24969c7e9 6717241: some diagnostic argument is prematurely converted into a String object
mcimadamore
parents: 735
diff changeset
   279
        return owner;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   280
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   281
939
38e24969c7e9 6717241: some diagnostic argument is prematurely converted into a String object
mcimadamore
parents: 735
diff changeset
   282
    public Symbol location(Type site, Types types) {
1260
a772ba9ba43d 6574134: Allow for alternative implementation of Name Table with garbage collection of name bytes
jjg
parents: 1257
diff changeset
   283
        if (owner.name == null || owner.name.isEmpty()) {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   284
            return location();
06bc494ca11e Initial load
duke
parents:
diff changeset
   285
        }
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
   286
        if (owner.type.hasTag(CLASS)) {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   287
            Type ownertype = types.asOuterSuper(site, owner);
939
38e24969c7e9 6717241: some diagnostic argument is prematurely converted into a String object
mcimadamore
parents: 735
diff changeset
   288
            if (ownertype != null) return ownertype.tsym;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   289
        }
939
38e24969c7e9 6717241: some diagnostic argument is prematurely converted into a String object
mcimadamore
parents: 735
diff changeset
   290
        return owner;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   291
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   292
14051
9097cec96212 7188968: New instance creation expression using diamond is checked twice
mcimadamore
parents: 14046
diff changeset
   293
    public Symbol baseSymbol() {
9097cec96212 7188968: New instance creation expression using diamond is checked twice
mcimadamore
parents: 14046
diff changeset
   294
        return this;
9097cec96212 7188968: New instance creation expression using diamond is checked twice
mcimadamore
parents: 14046
diff changeset
   295
    }
9097cec96212 7188968: New instance creation expression using diamond is checked twice
mcimadamore
parents: 14046
diff changeset
   296
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   297
    /** The symbol's erased type.
06bc494ca11e Initial load
duke
parents:
diff changeset
   298
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   299
    public Type erasure(Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   300
        if (erasure_field == null)
06bc494ca11e Initial load
duke
parents:
diff changeset
   301
            erasure_field = types.erasure(type);
06bc494ca11e Initial load
duke
parents:
diff changeset
   302
        return erasure_field;
06bc494ca11e Initial load
duke
parents:
diff changeset
   303
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   304
06bc494ca11e Initial load
duke
parents:
diff changeset
   305
    /** The external type of a symbol. This is the symbol's erased type
06bc494ca11e Initial load
duke
parents:
diff changeset
   306
     *  except for constructors of inner classes which get the enclosing
06bc494ca11e Initial load
duke
parents:
diff changeset
   307
     *  instance class added as first argument.
06bc494ca11e Initial load
duke
parents:
diff changeset
   308
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   309
    public Type externalType(Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   310
        Type t = erasure(types);
1260
a772ba9ba43d 6574134: Allow for alternative implementation of Name Table with garbage collection of name bytes
jjg
parents: 1257
diff changeset
   311
        if (name == name.table.names.init && owner.hasOuterInstance()) {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   312
            Type outerThisType = types.erasure(owner.type.getEnclosingType());
06bc494ca11e Initial load
duke
parents:
diff changeset
   313
            return new MethodType(t.getParameterTypes().prepend(outerThisType),
06bc494ca11e Initial load
duke
parents:
diff changeset
   314
                                  t.getReturnType(),
06bc494ca11e Initial load
duke
parents:
diff changeset
   315
                                  t.getThrownTypes(),
06bc494ca11e Initial load
duke
parents:
diff changeset
   316
                                  t.tsym);
06bc494ca11e Initial load
duke
parents:
diff changeset
   317
        } else {
06bc494ca11e Initial load
duke
parents:
diff changeset
   318
            return t;
06bc494ca11e Initial load
duke
parents:
diff changeset
   319
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   320
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   321
18010
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   322
    public boolean isDeprecated() {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   323
        return (flags_field & DEPRECATED) != 0;
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   324
    }
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   325
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   326
    public boolean isStatic() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   327
        return
06bc494ca11e Initial load
duke
parents:
diff changeset
   328
            (flags() & STATIC) != 0 ||
06bc494ca11e Initial load
duke
parents:
diff changeset
   329
            (owner.flags() & INTERFACE) != 0 && kind != MTH;
06bc494ca11e Initial load
duke
parents:
diff changeset
   330
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   331
06bc494ca11e Initial load
duke
parents:
diff changeset
   332
    public boolean isInterface() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   333
        return (flags() & INTERFACE) != 0;
06bc494ca11e Initial load
duke
parents:
diff changeset
   334
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   335
15720
e61b2f7a5148 8006345: Report Synthesized Parameters in java.lang.reflect.Parameter API
mcimadamore
parents: 15719
diff changeset
   336
    public boolean isPrivate() {
e61b2f7a5148 8006345: Report Synthesized Parameters in java.lang.reflect.Parameter API
mcimadamore
parents: 15719
diff changeset
   337
        return (flags_field & Flags.AccessFlags) == PRIVATE;
e61b2f7a5148 8006345: Report Synthesized Parameters in java.lang.reflect.Parameter API
mcimadamore
parents: 15719
diff changeset
   338
    }
e61b2f7a5148 8006345: Report Synthesized Parameters in java.lang.reflect.Parameter API
mcimadamore
parents: 15719
diff changeset
   339
e61b2f7a5148 8006345: Report Synthesized Parameters in java.lang.reflect.Parameter API
mcimadamore
parents: 15719
diff changeset
   340
    public boolean isEnum() {
e61b2f7a5148 8006345: Report Synthesized Parameters in java.lang.reflect.Parameter API
mcimadamore
parents: 15719
diff changeset
   341
        return (flags() & ENUM) != 0;
e61b2f7a5148 8006345: Report Synthesized Parameters in java.lang.reflect.Parameter API
mcimadamore
parents: 15719
diff changeset
   342
    }
e61b2f7a5148 8006345: Report Synthesized Parameters in java.lang.reflect.Parameter API
mcimadamore
parents: 15719
diff changeset
   343
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   344
    /** Is this symbol declared (directly or indirectly) local
06bc494ca11e Initial load
duke
parents:
diff changeset
   345
     *  to a method or variable initializer?
06bc494ca11e Initial load
duke
parents:
diff changeset
   346
     *  Also includes fields of inner classes which are in
06bc494ca11e Initial load
duke
parents:
diff changeset
   347
     *  turn local to a method or variable initializer.
06bc494ca11e Initial load
duke
parents:
diff changeset
   348
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   349
    public boolean isLocal() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   350
        return
06bc494ca11e Initial load
duke
parents:
diff changeset
   351
            (owner.kind & (VAR | MTH)) != 0 ||
06bc494ca11e Initial load
duke
parents:
diff changeset
   352
            (owner.kind == TYP && owner.isLocal());
06bc494ca11e Initial load
duke
parents:
diff changeset
   353
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   354
5321
c8efe769cb3b 6939620: Switch to 'complex' diamond inference scheme
mcimadamore
parents: 5006
diff changeset
   355
    /** Has this symbol an empty name? This includes anonymous
16333
a6e1ded87200 8009138: javac, equals-hashCode warning tuning
vromero
parents: 16320
diff changeset
   356
     *  inner classes.
5321
c8efe769cb3b 6939620: Switch to 'complex' diamond inference scheme
mcimadamore
parents: 5006
diff changeset
   357
     */
c8efe769cb3b 6939620: Switch to 'complex' diamond inference scheme
mcimadamore
parents: 5006
diff changeset
   358
    public boolean isAnonymous() {
c8efe769cb3b 6939620: Switch to 'complex' diamond inference scheme
mcimadamore
parents: 5006
diff changeset
   359
        return name.isEmpty();
c8efe769cb3b 6939620: Switch to 'complex' diamond inference scheme
mcimadamore
parents: 5006
diff changeset
   360
    }
c8efe769cb3b 6939620: Switch to 'complex' diamond inference scheme
mcimadamore
parents: 5006
diff changeset
   361
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   362
    /** Is this symbol a constructor?
06bc494ca11e Initial load
duke
parents:
diff changeset
   363
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   364
    public boolean isConstructor() {
1260
a772ba9ba43d 6574134: Allow for alternative implementation of Name Table with garbage collection of name bytes
jjg
parents: 1257
diff changeset
   365
        return name == name.table.names.init;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   366
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   367
06bc494ca11e Initial load
duke
parents:
diff changeset
   368
    /** The fully qualified name of this symbol.
06bc494ca11e Initial load
duke
parents:
diff changeset
   369
     *  This is the same as the symbol's name except for class symbols,
06bc494ca11e Initial load
duke
parents:
diff changeset
   370
     *  which are handled separately.
06bc494ca11e Initial load
duke
parents:
diff changeset
   371
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   372
    public Name getQualifiedName() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   373
        return name;
06bc494ca11e Initial load
duke
parents:
diff changeset
   374
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   375
06bc494ca11e Initial load
duke
parents:
diff changeset
   376
    /** The fully qualified name of this symbol after converting to flat
06bc494ca11e Initial load
duke
parents:
diff changeset
   377
     *  representation. This is the same as the symbol's name except for
06bc494ca11e Initial load
duke
parents:
diff changeset
   378
     *  class symbols, which are handled separately.
06bc494ca11e Initial load
duke
parents:
diff changeset
   379
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   380
    public Name flatName() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   381
        return getQualifiedName();
06bc494ca11e Initial load
duke
parents:
diff changeset
   382
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   383
06bc494ca11e Initial load
duke
parents:
diff changeset
   384
    /** If this is a class or package, its members, otherwise null.
06bc494ca11e Initial load
duke
parents:
diff changeset
   385
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   386
    public Scope members() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   387
        return null;
06bc494ca11e Initial load
duke
parents:
diff changeset
   388
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   389
06bc494ca11e Initial load
duke
parents:
diff changeset
   390
    /** A class is an inner class if it it has an enclosing instance class.
06bc494ca11e Initial load
duke
parents:
diff changeset
   391
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   392
    public boolean isInner() {
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
   393
        return type.getEnclosingType().hasTag(CLASS);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   394
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   395
06bc494ca11e Initial load
duke
parents:
diff changeset
   396
    /** An inner class has an outer instance if it is not an interface
06bc494ca11e Initial load
duke
parents:
diff changeset
   397
     *  it has an enclosing instance class which might be referenced from the class.
06bc494ca11e Initial load
duke
parents:
diff changeset
   398
     *  Nested classes can see instance members of their enclosing class.
06bc494ca11e Initial load
duke
parents:
diff changeset
   399
     *  Their constructors carry an additional this$n parameter, inserted
06bc494ca11e Initial load
duke
parents:
diff changeset
   400
     *  implicitly by the compiler.
06bc494ca11e Initial load
duke
parents:
diff changeset
   401
     *
06bc494ca11e Initial load
duke
parents:
diff changeset
   402
     *  @see #isInner
06bc494ca11e Initial load
duke
parents:
diff changeset
   403
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   404
    public boolean hasOuterInstance() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   405
        return
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
   406
            type.getEnclosingType().hasTag(CLASS) && (flags() & (INTERFACE | NOOUTERTHIS)) == 0;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   407
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   408
06bc494ca11e Initial load
duke
parents:
diff changeset
   409
    /** The closest enclosing class of this symbol's declaration.
06bc494ca11e Initial load
duke
parents:
diff changeset
   410
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   411
    public ClassSymbol enclClass() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   412
        Symbol c = this;
06bc494ca11e Initial load
duke
parents:
diff changeset
   413
        while (c != null &&
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
   414
               ((c.kind & TYP) == 0 || !c.type.hasTag(CLASS))) {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   415
            c = c.owner;
06bc494ca11e Initial load
duke
parents:
diff changeset
   416
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   417
        return (ClassSymbol)c;
06bc494ca11e Initial load
duke
parents:
diff changeset
   418
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   419
06bc494ca11e Initial load
duke
parents:
diff changeset
   420
    /** The outermost class which indirectly owns this symbol.
06bc494ca11e Initial load
duke
parents:
diff changeset
   421
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   422
    public ClassSymbol outermostClass() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   423
        Symbol sym = this;
06bc494ca11e Initial load
duke
parents:
diff changeset
   424
        Symbol prev = null;
06bc494ca11e Initial load
duke
parents:
diff changeset
   425
        while (sym.kind != PCK) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   426
            prev = sym;
06bc494ca11e Initial load
duke
parents:
diff changeset
   427
            sym = sym.owner;
06bc494ca11e Initial load
duke
parents:
diff changeset
   428
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   429
        return (ClassSymbol) prev;
06bc494ca11e Initial load
duke
parents:
diff changeset
   430
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   431
06bc494ca11e Initial load
duke
parents:
diff changeset
   432
    /** The package which indirectly owns this symbol.
06bc494ca11e Initial load
duke
parents:
diff changeset
   433
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   434
    public PackageSymbol packge() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   435
        Symbol sym = this;
06bc494ca11e Initial load
duke
parents:
diff changeset
   436
        while (sym.kind != PCK) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   437
            sym = sym.owner;
06bc494ca11e Initial load
duke
parents:
diff changeset
   438
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   439
        return (PackageSymbol) sym;
06bc494ca11e Initial load
duke
parents:
diff changeset
   440
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   441
06bc494ca11e Initial load
duke
parents:
diff changeset
   442
    /** Is this symbol a subclass of `base'? Only defined for ClassSymbols.
06bc494ca11e Initial load
duke
parents:
diff changeset
   443
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   444
    public boolean isSubClass(Symbol base, Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   445
        throw new AssertionError("isSubClass " + this);
06bc494ca11e Initial load
duke
parents:
diff changeset
   446
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   447
06bc494ca11e Initial load
duke
parents:
diff changeset
   448
    /** Fully check membership: hierarchy, protection, and hiding.
06bc494ca11e Initial load
duke
parents:
diff changeset
   449
     *  Does not exclude methods not inherited due to overriding.
06bc494ca11e Initial load
duke
parents:
diff changeset
   450
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   451
    public boolean isMemberOf(TypeSymbol clazz, Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   452
        return
06bc494ca11e Initial load
duke
parents:
diff changeset
   453
            owner == clazz ||
06bc494ca11e Initial load
duke
parents:
diff changeset
   454
            clazz.isSubClass(owner, types) &&
06bc494ca11e Initial load
duke
parents:
diff changeset
   455
            isInheritedIn(clazz, types) &&
06bc494ca11e Initial load
duke
parents:
diff changeset
   456
            !hiddenIn((ClassSymbol)clazz, types);
06bc494ca11e Initial load
duke
parents:
diff changeset
   457
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   458
06bc494ca11e Initial load
duke
parents:
diff changeset
   459
    /** Is this symbol the same as or enclosed by the given class? */
06bc494ca11e Initial load
duke
parents:
diff changeset
   460
    public boolean isEnclosedBy(ClassSymbol clazz) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   461
        for (Symbol sym = this; sym.kind != PCK; sym = sym.owner)
06bc494ca11e Initial load
duke
parents:
diff changeset
   462
            if (sym == clazz) return true;
06bc494ca11e Initial load
duke
parents:
diff changeset
   463
        return false;
06bc494ca11e Initial load
duke
parents:
diff changeset
   464
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   465
06bc494ca11e Initial load
duke
parents:
diff changeset
   466
    /** Check for hiding.  Note that this doesn't handle multiple
06bc494ca11e Initial load
duke
parents:
diff changeset
   467
     *  (interface) inheritance. */
06bc494ca11e Initial load
duke
parents:
diff changeset
   468
    private boolean hiddenIn(ClassSymbol clazz, Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   469
        if (kind == MTH && (flags() & STATIC) == 0) return false;
06bc494ca11e Initial load
duke
parents:
diff changeset
   470
        while (true) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   471
            if (owner == clazz) return false;
06bc494ca11e Initial load
duke
parents:
diff changeset
   472
            Scope.Entry e = clazz.members().lookup(name);
06bc494ca11e Initial load
duke
parents:
diff changeset
   473
            while (e.scope != null) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   474
                if (e.sym == this) return false;
06bc494ca11e Initial load
duke
parents:
diff changeset
   475
                if (e.sym.kind == kind &&
06bc494ca11e Initial load
duke
parents:
diff changeset
   476
                    (kind != MTH ||
06bc494ca11e Initial load
duke
parents:
diff changeset
   477
                     (e.sym.flags() & STATIC) != 0 &&
06bc494ca11e Initial load
duke
parents:
diff changeset
   478
                     types.isSubSignature(e.sym.type, type)))
06bc494ca11e Initial load
duke
parents:
diff changeset
   479
                    return true;
06bc494ca11e Initial load
duke
parents:
diff changeset
   480
                e = e.next();
06bc494ca11e Initial load
duke
parents:
diff changeset
   481
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
   482
            Type superType = types.supertype(clazz.type);
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
   483
            if (!superType.hasTag(CLASS)) return false;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   484
            clazz = (ClassSymbol)superType.tsym;
06bc494ca11e Initial load
duke
parents:
diff changeset
   485
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   486
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   487
06bc494ca11e Initial load
duke
parents:
diff changeset
   488
    /** Is this symbol inherited into a given class?
06bc494ca11e Initial load
duke
parents:
diff changeset
   489
     *  PRE: If symbol's owner is a interface,
06bc494ca11e Initial load
duke
parents:
diff changeset
   490
     *       it is already assumed that the interface is a superinterface
06bc494ca11e Initial load
duke
parents:
diff changeset
   491
     *       of given class.
06bc494ca11e Initial load
duke
parents:
diff changeset
   492
     *  @param clazz  The class for which we want to establish membership.
06bc494ca11e Initial load
duke
parents:
diff changeset
   493
     *                This must be a subclass of the member's owner.
06bc494ca11e Initial load
duke
parents:
diff changeset
   494
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   495
    public boolean isInheritedIn(Symbol clazz, Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   496
        switch ((int)(flags_field & Flags.AccessFlags)) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   497
        default: // error recovery
06bc494ca11e Initial load
duke
parents:
diff changeset
   498
        case PUBLIC:
06bc494ca11e Initial load
duke
parents:
diff changeset
   499
            return true;
06bc494ca11e Initial load
duke
parents:
diff changeset
   500
        case PRIVATE:
06bc494ca11e Initial load
duke
parents:
diff changeset
   501
            return this.owner == clazz;
06bc494ca11e Initial load
duke
parents:
diff changeset
   502
        case PROTECTED:
06bc494ca11e Initial load
duke
parents:
diff changeset
   503
            // we model interfaces as extending Object
06bc494ca11e Initial load
duke
parents:
diff changeset
   504
            return (clazz.flags() & INTERFACE) == 0;
06bc494ca11e Initial load
duke
parents:
diff changeset
   505
        case 0:
06bc494ca11e Initial load
duke
parents:
diff changeset
   506
            PackageSymbol thisPackage = this.packge();
06bc494ca11e Initial load
duke
parents:
diff changeset
   507
            for (Symbol sup = clazz;
06bc494ca11e Initial load
duke
parents:
diff changeset
   508
                 sup != null && sup != this.owner;
06bc494ca11e Initial load
duke
parents:
diff changeset
   509
                 sup = types.supertype(sup.type).tsym) {
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
   510
                while (sup.type.hasTag(TYPEVAR))
1528
441d4ec466de 6711619: javac doesn't allow access to protected members in intersection types
mcimadamore
parents: 1357
diff changeset
   511
                    sup = sup.type.getUpperBound().tsym;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   512
                if (sup.type.isErroneous())
06bc494ca11e Initial load
duke
parents:
diff changeset
   513
                    return true; // error recovery
06bc494ca11e Initial load
duke
parents:
diff changeset
   514
                if ((sup.flags() & COMPOUND) != 0)
06bc494ca11e Initial load
duke
parents:
diff changeset
   515
                    continue;
06bc494ca11e Initial load
duke
parents:
diff changeset
   516
                if (sup.packge() != thisPackage)
06bc494ca11e Initial load
duke
parents:
diff changeset
   517
                    return false;
06bc494ca11e Initial load
duke
parents:
diff changeset
   518
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
   519
            return (clazz.flags() & INTERFACE) == 0;
06bc494ca11e Initial load
duke
parents:
diff changeset
   520
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   521
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   522
06bc494ca11e Initial load
duke
parents:
diff changeset
   523
    /** The (variable or method) symbol seen as a member of given
06bc494ca11e Initial load
duke
parents:
diff changeset
   524
     *  class type`site' (this might change the symbol's type).
06bc494ca11e Initial load
duke
parents:
diff changeset
   525
     *  This is used exclusively for producing diagnostics.
06bc494ca11e Initial load
duke
parents:
diff changeset
   526
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   527
    public Symbol asMemberOf(Type site, Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   528
        throw new AssertionError();
06bc494ca11e Initial load
duke
parents:
diff changeset
   529
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   530
06bc494ca11e Initial load
duke
parents:
diff changeset
   531
    /** Does this method symbol override `other' symbol, when both are seen as
06bc494ca11e Initial load
duke
parents:
diff changeset
   532
     *  members of class `origin'?  It is assumed that _other is a member
06bc494ca11e Initial load
duke
parents:
diff changeset
   533
     *  of origin.
06bc494ca11e Initial load
duke
parents:
diff changeset
   534
     *
06bc494ca11e Initial load
duke
parents:
diff changeset
   535
     *  It is assumed that both symbols have the same name.  The static
06bc494ca11e Initial load
duke
parents:
diff changeset
   536
     *  modifier is ignored for this test.
06bc494ca11e Initial load
duke
parents:
diff changeset
   537
     *
06bc494ca11e Initial load
duke
parents:
diff changeset
   538
     *  See JLS 8.4.6.1 (without transitivity) and 8.4.6.4
06bc494ca11e Initial load
duke
parents:
diff changeset
   539
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   540
    public boolean overrides(Symbol _other, TypeSymbol origin, Types types, boolean checkResult) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   541
        return false;
06bc494ca11e Initial load
duke
parents:
diff changeset
   542
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   543
06bc494ca11e Initial load
duke
parents:
diff changeset
   544
    /** Complete the elaboration of this symbol's definition.
06bc494ca11e Initial load
duke
parents:
diff changeset
   545
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   546
    public void complete() throws CompletionFailure {
06bc494ca11e Initial load
duke
parents:
diff changeset
   547
        if (completer != null) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   548
            Completer c = completer;
06bc494ca11e Initial load
duke
parents:
diff changeset
   549
            completer = null;
06bc494ca11e Initial load
duke
parents:
diff changeset
   550
            c.complete(this);
06bc494ca11e Initial load
duke
parents:
diff changeset
   551
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   552
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   553
06bc494ca11e Initial load
duke
parents:
diff changeset
   554
    /** True if the symbol represents an entity that exists.
06bc494ca11e Initial load
duke
parents:
diff changeset
   555
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   556
    public boolean exists() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   557
        return true;
06bc494ca11e Initial load
duke
parents:
diff changeset
   558
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   559
06bc494ca11e Initial load
duke
parents:
diff changeset
   560
    public Type asType() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   561
        return type;
06bc494ca11e Initial load
duke
parents:
diff changeset
   562
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   563
06bc494ca11e Initial load
duke
parents:
diff changeset
   564
    public Symbol getEnclosingElement() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   565
        return owner;
06bc494ca11e Initial load
duke
parents:
diff changeset
   566
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   567
06bc494ca11e Initial load
duke
parents:
diff changeset
   568
    public ElementKind getKind() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   569
        return ElementKind.OTHER;       // most unkind
06bc494ca11e Initial load
duke
parents:
diff changeset
   570
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   571
06bc494ca11e Initial load
duke
parents:
diff changeset
   572
    public Set<Modifier> getModifiers() {
16970
0967fa88590b 8011383: Symbol.getModifiers omits ACC_ABSTRACT from interface with default methods
mcimadamore
parents: 16967
diff changeset
   573
        return Flags.asModifierSet(flags());
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   574
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   575
06bc494ca11e Initial load
duke
parents:
diff changeset
   576
    public Name getSimpleName() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   577
        return name;
06bc494ca11e Initial load
duke
parents:
diff changeset
   578
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   579
06bc494ca11e Initial load
duke
parents:
diff changeset
   580
    /**
14961
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   581
     * This is the implementation for {@code
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   582
     * javax.lang.model.element.Element.getAnnotationMirrors()}.
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   583
     */
17278
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   584
    @Override
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   585
    public List<Attribute.Compound> getAnnotationMirrors() {
14961
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   586
        return getRawAttributes();
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   587
    }
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   588
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   589
    /**
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   590
     * @deprecated this method should never be used by javac internally.
06bc494ca11e Initial load
duke
parents:
diff changeset
   591
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   592
    @Deprecated
06bc494ca11e Initial load
duke
parents:
diff changeset
   593
    public <A extends java.lang.annotation.Annotation> A getAnnotation(Class<A> annoType) {
16557
67a3ae363f03 8007803: Implement javax.lang.model API for Type Annotations
jjg
parents: 16333
diff changeset
   594
        return JavacAnnoConstructs.getAnnotation(this, annoType);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   595
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   596
15355
a4757c33cae9 7193719: Support repeating annotations in javax.lang.model
jfranck
parents: 15031
diff changeset
   597
    // This method is part of the javax.lang.model API, do not use this in javac code.
15719
6b64cf96346b 8007279: Rename javax.l.model.element.Element.getAnnotations(Class) to getAnnotationsByType(Class)
jfranck
parents: 15564
diff changeset
   598
    public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(Class<A> annoType) {
16557
67a3ae363f03 8007803: Implement javax.lang.model API for Type Annotations
jjg
parents: 16333
diff changeset
   599
        return JavacAnnoConstructs.getAnnotations(this, annoType);
15355
a4757c33cae9 7193719: Support repeating annotations in javax.lang.model
jfranck
parents: 15031
diff changeset
   600
    }
a4757c33cae9 7193719: Support repeating annotations in javax.lang.model
jfranck
parents: 15031
diff changeset
   601
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   602
    // TODO: getEnclosedElements should return a javac List, fix in FilteredMemberList
06bc494ca11e Initial load
duke
parents:
diff changeset
   603
    public java.util.List<Symbol> getEnclosedElements() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   604
        return List.nil();
06bc494ca11e Initial load
duke
parents:
diff changeset
   605
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   606
16967
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   607
    public List<TypeVariableSymbol> getTypeParameters() {
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   608
        ListBuffer<TypeVariableSymbol> l = ListBuffer.lb();
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   609
        for (Type t : type.getTypeArguments()) {
16967
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   610
            Assert.check(t.tsym.getKind() == ElementKind.TYPE_PARAMETER);
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   611
            l.append((TypeVariableSymbol)t.tsym);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   612
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   613
        return l.toList();
06bc494ca11e Initial load
duke
parents:
diff changeset
   614
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   615
15564
6d8db91563a7 8005075: Pool.Method, and Pool.Variable redundant Symbol field should be removed
vromero
parents: 15385
diff changeset
   616
    public static class DelegatedSymbol<T extends Symbol> extends Symbol {
6d8db91563a7 8005075: Pool.Method, and Pool.Variable redundant Symbol field should be removed
vromero
parents: 15385
diff changeset
   617
        protected T other;
6d8db91563a7 8005075: Pool.Method, and Pool.Variable redundant Symbol field should be removed
vromero
parents: 15385
diff changeset
   618
        public DelegatedSymbol(T other) {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   619
            super(other.kind, other.flags_field, other.name, other.type, other.owner);
06bc494ca11e Initial load
duke
parents:
diff changeset
   620
            this.other = other;
06bc494ca11e Initial load
duke
parents:
diff changeset
   621
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   622
        public String toString() { return other.toString(); }
939
38e24969c7e9 6717241: some diagnostic argument is prematurely converted into a String object
mcimadamore
parents: 735
diff changeset
   623
        public Symbol location() { return other.location(); }
38e24969c7e9 6717241: some diagnostic argument is prematurely converted into a String object
mcimadamore
parents: 735
diff changeset
   624
        public Symbol location(Type site, Types types) { return other.location(site, types); }
14547
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents: 14443
diff changeset
   625
        public Symbol baseSymbol() { return other; }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   626
        public Type erasure(Types types) { return other.erasure(types); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   627
        public Type externalType(Types types) { return other.externalType(types); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   628
        public boolean isLocal() { return other.isLocal(); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   629
        public boolean isConstructor() { return other.isConstructor(); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   630
        public Name getQualifiedName() { return other.getQualifiedName(); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   631
        public Name flatName() { return other.flatName(); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   632
        public Scope members() { return other.members(); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   633
        public boolean isInner() { return other.isInner(); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   634
        public boolean hasOuterInstance() { return other.hasOuterInstance(); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   635
        public ClassSymbol enclClass() { return other.enclClass(); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   636
        public ClassSymbol outermostClass() { return other.outermostClass(); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   637
        public PackageSymbol packge() { return other.packge(); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   638
        public boolean isSubClass(Symbol base, Types types) { return other.isSubClass(base, types); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   639
        public boolean isMemberOf(TypeSymbol clazz, Types types) { return other.isMemberOf(clazz, types); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   640
        public boolean isEnclosedBy(ClassSymbol clazz) { return other.isEnclosedBy(clazz); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   641
        public boolean isInheritedIn(Symbol clazz, Types types) { return other.isInheritedIn(clazz, types); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   642
        public Symbol asMemberOf(Type site, Types types) { return other.asMemberOf(site, types); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   643
        public void complete() throws CompletionFailure { other.complete(); }
06bc494ca11e Initial load
duke
parents:
diff changeset
   644
06bc494ca11e Initial load
duke
parents:
diff changeset
   645
        public <R, P> R accept(ElementVisitor<R, P> v, P p) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   646
            return other.accept(v, p);
06bc494ca11e Initial load
duke
parents:
diff changeset
   647
        }
1357
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   648
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   649
        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   650
            return v.visitSymbol(other, p);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   651
        }
15564
6d8db91563a7 8005075: Pool.Method, and Pool.Variable redundant Symbol field should be removed
vromero
parents: 15385
diff changeset
   652
6d8db91563a7 8005075: Pool.Method, and Pool.Variable redundant Symbol field should be removed
vromero
parents: 15385
diff changeset
   653
        public T getUnderlyingSymbol() {
6d8db91563a7 8005075: Pool.Method, and Pool.Variable redundant Symbol field should be removed
vromero
parents: 15385
diff changeset
   654
            return other;
6d8db91563a7 8005075: Pool.Method, and Pool.Variable redundant Symbol field should be removed
vromero
parents: 15385
diff changeset
   655
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   656
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   657
16967
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   658
    /** A base class for Symbols representing types.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   659
     */
16967
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   660
    public static abstract class TypeSymbol extends Symbol {
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   661
        public TypeSymbol(int kind, long flags, Name name, Type type, Symbol owner) {
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   662
            super(kind, flags, name, type, owner);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   663
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   664
        /** form a fully qualified name from a name and an owner
06bc494ca11e Initial load
duke
parents:
diff changeset
   665
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   666
        static public Name formFullName(Name name, Symbol owner) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   667
            if (owner == null) return name;
06bc494ca11e Initial load
duke
parents:
diff changeset
   668
            if (((owner.kind != ERR)) &&
06bc494ca11e Initial load
duke
parents:
diff changeset
   669
                ((owner.kind & (VAR | MTH)) != 0
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
   670
                 || (owner.kind == TYP && owner.type.hasTag(TYPEVAR))
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   671
                 )) return name;
06bc494ca11e Initial load
duke
parents:
diff changeset
   672
            Name prefix = owner.getQualifiedName();
1260
a772ba9ba43d 6574134: Allow for alternative implementation of Name Table with garbage collection of name bytes
jjg
parents: 1257
diff changeset
   673
            if (prefix == null || prefix == prefix.table.names.empty)
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   674
                return name;
06bc494ca11e Initial load
duke
parents:
diff changeset
   675
            else return prefix.append('.', name);
06bc494ca11e Initial load
duke
parents:
diff changeset
   676
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   677
06bc494ca11e Initial load
duke
parents:
diff changeset
   678
        /** form a fully qualified name from a name and an owner, after
06bc494ca11e Initial load
duke
parents:
diff changeset
   679
         *  converting to flat representation
06bc494ca11e Initial load
duke
parents:
diff changeset
   680
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   681
        static public Name formFlatName(Name name, Symbol owner) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   682
            if (owner == null ||
06bc494ca11e Initial load
duke
parents:
diff changeset
   683
                (owner.kind & (VAR | MTH)) != 0
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
   684
                || (owner.kind == TYP && owner.type.hasTag(TYPEVAR))
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   685
                ) return name;
06bc494ca11e Initial load
duke
parents:
diff changeset
   686
            char sep = owner.kind == TYP ? '$' : '.';
06bc494ca11e Initial load
duke
parents:
diff changeset
   687
            Name prefix = owner.flatName();
1260
a772ba9ba43d 6574134: Allow for alternative implementation of Name Table with garbage collection of name bytes
jjg
parents: 1257
diff changeset
   688
            if (prefix == null || prefix == prefix.table.names.empty)
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   689
                return name;
06bc494ca11e Initial load
duke
parents:
diff changeset
   690
            else return prefix.append(sep, name);
06bc494ca11e Initial load
duke
parents:
diff changeset
   691
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   692
06bc494ca11e Initial load
duke
parents:
diff changeset
   693
        /**
06bc494ca11e Initial load
duke
parents:
diff changeset
   694
         * A total ordering between type symbols that refines the
06bc494ca11e Initial load
duke
parents:
diff changeset
   695
         * class inheritance graph.
06bc494ca11e Initial load
duke
parents:
diff changeset
   696
         *
06bc494ca11e Initial load
duke
parents:
diff changeset
   697
         * Typevariables always precede other kinds of symbols.
06bc494ca11e Initial load
duke
parents:
diff changeset
   698
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   699
        public final boolean precedes(TypeSymbol that, Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   700
            if (this == that)
06bc494ca11e Initial load
duke
parents:
diff changeset
   701
                return false;
18646
e628560a86d1 8017104: javac should have a class for primitive types that inherits from Type
vromero
parents: 18389
diff changeset
   702
            if (type.hasTag(that.type.getTag())) {
e628560a86d1 8017104: javac should have a class for primitive types that inherits from Type
vromero
parents: 18389
diff changeset
   703
                if (type.hasTag(CLASS)) {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   704
                    return
06bc494ca11e Initial load
duke
parents:
diff changeset
   705
                        types.rank(that.type) < types.rank(this.type) ||
06bc494ca11e Initial load
duke
parents:
diff changeset
   706
                        types.rank(that.type) == types.rank(this.type) &&
06bc494ca11e Initial load
duke
parents:
diff changeset
   707
                        that.getQualifiedName().compareTo(this.getQualifiedName()) < 0;
18646
e628560a86d1 8017104: javac should have a class for primitive types that inherits from Type
vromero
parents: 18389
diff changeset
   708
                } else if (type.hasTag(TYPEVAR)) {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   709
                    return types.isSubtype(this.type, that.type);
06bc494ca11e Initial load
duke
parents:
diff changeset
   710
                }
06bc494ca11e Initial load
duke
parents:
diff changeset
   711
            }
18646
e628560a86d1 8017104: javac should have a class for primitive types that inherits from Type
vromero
parents: 18389
diff changeset
   712
            return type.hasTag(TYPEVAR);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   713
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   714
16967
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   715
        @Override
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   716
        public java.util.List<Symbol> getEnclosedElements() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   717
            List<Symbol> list = List.nil();
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
   718
            if (kind == TYP && type.hasTag(TYPEVAR)) {
6584
c3d25d0ad536 6458749: TypeParameterElement.getEnclosedElements throws NPE within javac.
sundar
parents: 6148
diff changeset
   719
                return list;
c3d25d0ad536 6458749: TypeParameterElement.getEnclosedElements throws NPE within javac.
sundar
parents: 6148
diff changeset
   720
            }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   721
            for (Scope.Entry e = members().elems; e != null; e = e.sibling) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   722
                if (e.sym != null && (e.sym.flags() & SYNTHETIC) == 0 && e.sym.owner == this)
06bc494ca11e Initial load
duke
parents:
diff changeset
   723
                    list = list.prepend(e.sym);
06bc494ca11e Initial load
duke
parents:
diff changeset
   724
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
   725
            return list;
06bc494ca11e Initial load
duke
parents:
diff changeset
   726
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   727
16967
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   728
        @Override
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   729
        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   730
            return v.visitTypeSymbol(this, p);
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   731
        }
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   732
    }
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   733
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   734
    /**
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   735
     * Type variables are represented by instances of this class.
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   736
     */
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   737
    public static class TypeVariableSymbol
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   738
            extends TypeSymbol implements TypeParameterElement {
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   739
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   740
        public TypeVariableSymbol(long flags, Name name, Type type, Symbol owner) {
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   741
            super(TYP, flags, name, type, owner);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   742
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   743
16967
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   744
        public ElementKind getKind() {
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   745
            return ElementKind.TYPE_PARAMETER;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   746
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   747
16967
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   748
        @Override
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   749
        public Symbol getGenericElement() {
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   750
            return owner;
1357
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   751
        }
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   752
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   753
        public List<Type> getBounds() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   754
            TypeVar t = (TypeVar)type;
06bc494ca11e Initial load
duke
parents:
diff changeset
   755
            Type bound = t.getUpperBound();
06bc494ca11e Initial load
duke
parents:
diff changeset
   756
            if (!bound.isCompound())
06bc494ca11e Initial load
duke
parents:
diff changeset
   757
                return List.of(bound);
06bc494ca11e Initial load
duke
parents:
diff changeset
   758
            ClassType ct = (ClassType)bound;
06bc494ca11e Initial load
duke
parents:
diff changeset
   759
            if (!ct.tsym.erasure_field.isInterface()) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   760
                return ct.interfaces_field.prepend(ct.supertype_field);
06bc494ca11e Initial load
duke
parents:
diff changeset
   761
            } else {
06bc494ca11e Initial load
duke
parents:
diff changeset
   762
                // No superclass was given in bounds.
06bc494ca11e Initial load
duke
parents:
diff changeset
   763
                // In this case, supertype is Object, erasure is first interface.
06bc494ca11e Initial load
duke
parents:
diff changeset
   764
                return ct.interfaces_field;
06bc494ca11e Initial load
duke
parents:
diff changeset
   765
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
   766
        }
16967
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   767
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   768
        @Override
17278
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   769
        public List<Attribute.Compound> getAnnotationMirrors() {
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   770
            return onlyTypeVariableAnnotations(owner.getRawTypeAttributes());
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   771
        }
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   772
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   773
        private List<Attribute.Compound> onlyTypeVariableAnnotations(
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   774
                List<Attribute.TypeCompound> candidates) {
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   775
            // Declaration annotations on TypeParameters are stored in type attributes
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   776
            List<Attribute.Compound> res = List.nil();
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   777
            for (Attribute.TypeCompound a : candidates) {
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   778
                if (a.position.type == TargetType.CLASS_TYPE_PARAMETER ||
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   779
                    a.position.type == TargetType.METHOD_TYPE_PARAMETER)
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   780
                    res = res.prepend(a);
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   781
            }
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   782
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   783
            return res = res.reverse();
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   784
        }
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   785
a48ec76f26e9 8011027: Type parameter annotations not passed through to javax.lang.model
jfranck
parents: 16970
diff changeset
   786
        @Override
16967
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   787
        public <R, P> R accept(ElementVisitor<R, P> v, P p) {
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   788
            return v.visitTypeParameter(this, p);
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   789
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   790
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   791
06bc494ca11e Initial load
duke
parents:
diff changeset
   792
    /** A class for package symbols
06bc494ca11e Initial load
duke
parents:
diff changeset
   793
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   794
    public static class PackageSymbol extends TypeSymbol
06bc494ca11e Initial load
duke
parents:
diff changeset
   795
        implements PackageElement {
06bc494ca11e Initial load
duke
parents:
diff changeset
   796
06bc494ca11e Initial load
duke
parents:
diff changeset
   797
        public Scope members_field;
06bc494ca11e Initial load
duke
parents:
diff changeset
   798
        public Name fullname;
06bc494ca11e Initial load
duke
parents:
diff changeset
   799
        public ClassSymbol package_info; // see bug 6443073
06bc494ca11e Initial load
duke
parents:
diff changeset
   800
06bc494ca11e Initial load
duke
parents:
diff changeset
   801
        public PackageSymbol(Name name, Type type, Symbol owner) {
16967
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   802
            super(PCK, 0, name, type, owner);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   803
            this.members_field = null;
06bc494ca11e Initial load
duke
parents:
diff changeset
   804
            this.fullname = formFullName(name, owner);
06bc494ca11e Initial load
duke
parents:
diff changeset
   805
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   806
06bc494ca11e Initial load
duke
parents:
diff changeset
   807
        public PackageSymbol(Name name, Symbol owner) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   808
            this(name, null, owner);
06bc494ca11e Initial load
duke
parents:
diff changeset
   809
            this.type = new PackageType(this);
06bc494ca11e Initial load
duke
parents:
diff changeset
   810
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   811
06bc494ca11e Initial load
duke
parents:
diff changeset
   812
        public String toString() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   813
            return fullname.toString();
06bc494ca11e Initial load
duke
parents:
diff changeset
   814
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   815
06bc494ca11e Initial load
duke
parents:
diff changeset
   816
        public Name getQualifiedName() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   817
            return fullname;
06bc494ca11e Initial load
duke
parents:
diff changeset
   818
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   819
06bc494ca11e Initial load
duke
parents:
diff changeset
   820
        public boolean isUnnamed() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   821
            return name.isEmpty() && owner != null;
06bc494ca11e Initial load
duke
parents:
diff changeset
   822
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   823
06bc494ca11e Initial load
duke
parents:
diff changeset
   824
        public Scope members() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   825
            if (completer != null) complete();
06bc494ca11e Initial load
duke
parents:
diff changeset
   826
            return members_field;
06bc494ca11e Initial load
duke
parents:
diff changeset
   827
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   828
06bc494ca11e Initial load
duke
parents:
diff changeset
   829
        public long flags() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   830
            if (completer != null) complete();
06bc494ca11e Initial load
duke
parents:
diff changeset
   831
            return flags_field;
06bc494ca11e Initial load
duke
parents:
diff changeset
   832
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   833
14961
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   834
        @Override
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   835
        public List<Attribute.Compound> getRawAttributes() {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   836
            if (completer != null) complete();
4871
655bba719625 6499119: Created package-info class file modeled improperly
jjg
parents: 4077
diff changeset
   837
            if (package_info != null && package_info.completer != null) {
655bba719625 6499119: Created package-info class file modeled improperly
jjg
parents: 4077
diff changeset
   838
                package_info.complete();
14961
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   839
                mergeAttributes();
4871
655bba719625 6499119: Created package-info class file modeled improperly
jjg
parents: 4077
diff changeset
   840
            }
14961
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   841
            return super.getRawAttributes();
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   842
        }
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   843
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   844
        private void mergeAttributes() {
18010
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   845
            if (annotations == null &&
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   846
                package_info.annotations != null) {
604faee85350 8004643: Reduce javac space overhead introduced with compiler support for repeating annotations
jjg
parents: 17278
diff changeset
   847
                annotations = new Annotations(this);
14961
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   848
                annotations.setAttributes(package_info.annotations);
13689
4d519199a6aa 7151010: Add compiler support for repeating annotations
jfranck
parents: 12335
diff changeset
   849
            }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   850
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   851
06bc494ca11e Initial load
duke
parents:
diff changeset
   852
        /** A package "exists" if a type or package that exists has
06bc494ca11e Initial load
duke
parents:
diff changeset
   853
         *  been seen within it.
06bc494ca11e Initial load
duke
parents:
diff changeset
   854
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   855
        public boolean exists() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   856
            return (flags_field & EXISTS) != 0;
06bc494ca11e Initial load
duke
parents:
diff changeset
   857
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   858
06bc494ca11e Initial load
duke
parents:
diff changeset
   859
        public ElementKind getKind() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   860
            return ElementKind.PACKAGE;
06bc494ca11e Initial load
duke
parents:
diff changeset
   861
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   862
06bc494ca11e Initial load
duke
parents:
diff changeset
   863
        public Symbol getEnclosingElement() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   864
            return null;
06bc494ca11e Initial load
duke
parents:
diff changeset
   865
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   866
06bc494ca11e Initial load
duke
parents:
diff changeset
   867
        public <R, P> R accept(ElementVisitor<R, P> v, P p) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   868
            return v.visitPackage(this, p);
06bc494ca11e Initial load
duke
parents:
diff changeset
   869
        }
1357
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   870
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   871
        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   872
            return v.visitPackageSymbol(this, p);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
   873
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   874
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   875
06bc494ca11e Initial load
duke
parents:
diff changeset
   876
    /** A class for class symbols
06bc494ca11e Initial load
duke
parents:
diff changeset
   877
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   878
    public static class ClassSymbol extends TypeSymbol implements TypeElement {
06bc494ca11e Initial load
duke
parents:
diff changeset
   879
06bc494ca11e Initial load
duke
parents:
diff changeset
   880
        /** a scope for all class members; variables, methods and inner classes
06bc494ca11e Initial load
duke
parents:
diff changeset
   881
         *  type parameters are not part of this scope
06bc494ca11e Initial load
duke
parents:
diff changeset
   882
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   883
        public Scope members_field;
06bc494ca11e Initial load
duke
parents:
diff changeset
   884
06bc494ca11e Initial load
duke
parents:
diff changeset
   885
        /** the fully qualified name of the class, i.e. pck.outer.inner.
06bc494ca11e Initial load
duke
parents:
diff changeset
   886
         *  null for anonymous classes
06bc494ca11e Initial load
duke
parents:
diff changeset
   887
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   888
        public Name fullname;
06bc494ca11e Initial load
duke
parents:
diff changeset
   889
06bc494ca11e Initial load
duke
parents:
diff changeset
   890
        /** the fully qualified name of the class after converting to flat
06bc494ca11e Initial load
duke
parents:
diff changeset
   891
         *  representation, i.e. pck.outer$inner,
06bc494ca11e Initial load
duke
parents:
diff changeset
   892
         *  set externally for local and anonymous classes
06bc494ca11e Initial load
duke
parents:
diff changeset
   893
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   894
        public Name flatname;
06bc494ca11e Initial load
duke
parents:
diff changeset
   895
06bc494ca11e Initial load
duke
parents:
diff changeset
   896
        /** the sourcefile where the class came from
06bc494ca11e Initial load
duke
parents:
diff changeset
   897
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   898
        public JavaFileObject sourcefile;
06bc494ca11e Initial load
duke
parents:
diff changeset
   899
06bc494ca11e Initial load
duke
parents:
diff changeset
   900
        /** the classfile from where to load this class
06bc494ca11e Initial load
duke
parents:
diff changeset
   901
         *  this will have extension .class or .java
06bc494ca11e Initial load
duke
parents:
diff changeset
   902
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   903
        public JavaFileObject classfile;
06bc494ca11e Initial load
duke
parents:
diff changeset
   904
10627
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents: 10626
diff changeset
   905
        /** the list of translated local classes (used for generating
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents: 10626
diff changeset
   906
         * InnerClasses attribute)
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents: 10626
diff changeset
   907
         */
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents: 10626
diff changeset
   908
        public List<ClassSymbol> trans_local;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents: 10626
diff changeset
   909
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   910
        /** the constant pool of the class
06bc494ca11e Initial load
duke
parents:
diff changeset
   911
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   912
        public Pool pool;
06bc494ca11e Initial load
duke
parents:
diff changeset
   913
06bc494ca11e Initial load
duke
parents:
diff changeset
   914
        public ClassSymbol(long flags, Name name, Type type, Symbol owner) {
16967
79d444669f3f 7015104: use new subtype of TypeSymbol for type parameters
jfranck
parents: 16557
diff changeset
   915
            super(TYP, flags, name, type, owner);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   916
            this.members_field = null;
06bc494ca11e Initial load
duke
parents:
diff changeset
   917
            this.fullname = formFullName(name, owner);
06bc494ca11e Initial load
duke
parents:
diff changeset
   918
            this.flatname = formFlatName(name, owner);
06bc494ca11e Initial load
duke
parents:
diff changeset
   919
            this.sourcefile = null;
06bc494ca11e Initial load
duke
parents:
diff changeset
   920
            this.classfile = null;
06bc494ca11e Initial load
duke
parents:
diff changeset
   921
            this.pool = null;
06bc494ca11e Initial load
duke
parents:
diff changeset
   922
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   923
06bc494ca11e Initial load
duke
parents:
diff changeset
   924
        public ClassSymbol(long flags, Name name, Symbol owner) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   925
            this(
06bc494ca11e Initial load
duke
parents:
diff changeset
   926
                flags,
06bc494ca11e Initial load
duke
parents:
diff changeset
   927
                name,
06bc494ca11e Initial load
duke
parents:
diff changeset
   928
                new ClassType(Type.noType, null, null),
06bc494ca11e Initial load
duke
parents:
diff changeset
   929
                owner);
06bc494ca11e Initial load
duke
parents:
diff changeset
   930
            this.type.tsym = this;
06bc494ca11e Initial load
duke
parents:
diff changeset
   931
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   932
06bc494ca11e Initial load
duke
parents:
diff changeset
   933
        /** The Java source which this symbol represents.
06bc494ca11e Initial load
duke
parents:
diff changeset
   934
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   935
        public String toString() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   936
            return className();
06bc494ca11e Initial load
duke
parents:
diff changeset
   937
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   938
06bc494ca11e Initial load
duke
parents:
diff changeset
   939
        public long flags() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   940
            if (completer != null) complete();
06bc494ca11e Initial load
duke
parents:
diff changeset
   941
            return flags_field;
06bc494ca11e Initial load
duke
parents:
diff changeset
   942
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   943
06bc494ca11e Initial load
duke
parents:
diff changeset
   944
        public Scope members() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   945
            if (completer != null) complete();
06bc494ca11e Initial load
duke
parents:
diff changeset
   946
            return members_field;
06bc494ca11e Initial load
duke
parents:
diff changeset
   947
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   948
14961
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   949
        @Override
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   950
        public List<Attribute.Compound> getRawAttributes() {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   951
            if (completer != null) complete();
14961
e731935052af 8005098: Provide isSynthesized() information on Attribute.Compound
jfranck
parents: 14956
diff changeset
   952
            return super.getRawAttributes();
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   953
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   954
15385
ee1eebe7e210 8006775: JSR 308: Compiler changes in JDK8
jjg
parents: 15377
diff changeset
   955
        @Override
ee1eebe7e210 8006775: JSR 308: Compiler changes in JDK8
jjg
parents: 15377
diff changeset
   956
        public List<Attribute.TypeCompound> getRawTypeAttributes() {
ee1eebe7e210 8006775: JSR 308: Compiler changes in JDK8
jjg
parents: 15377
diff changeset
   957
            if (completer != null) complete();
ee1eebe7e210 8006775: JSR 308: Compiler changes in JDK8
jjg
parents: 15377
diff changeset
   958
            return super.getRawTypeAttributes();
ee1eebe7e210 8006775: JSR 308: Compiler changes in JDK8
jjg
parents: 15377
diff changeset
   959
        }
ee1eebe7e210 8006775: JSR 308: Compiler changes in JDK8
jjg
parents: 15377
diff changeset
   960
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   961
        public Type erasure(Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   962
            if (erasure_field == null)
06bc494ca11e Initial load
duke
parents:
diff changeset
   963
                erasure_field = new ClassType(types.erasure(type.getEnclosingType()),
06bc494ca11e Initial load
duke
parents:
diff changeset
   964
                                              List.<Type>nil(), this);
06bc494ca11e Initial load
duke
parents:
diff changeset
   965
            return erasure_field;
06bc494ca11e Initial load
duke
parents:
diff changeset
   966
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   967
06bc494ca11e Initial load
duke
parents:
diff changeset
   968
        public String className() {
1260
a772ba9ba43d 6574134: Allow for alternative implementation of Name Table with garbage collection of name bytes
jjg
parents: 1257
diff changeset
   969
            if (name.isEmpty())
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   970
                return
06bc494ca11e Initial load
duke
parents:
diff changeset
   971
                    Log.getLocalizedString("anonymous.class", flatname);
06bc494ca11e Initial load
duke
parents:
diff changeset
   972
            else
06bc494ca11e Initial load
duke
parents:
diff changeset
   973
                return fullname.toString();
06bc494ca11e Initial load
duke
parents:
diff changeset
   974
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   975
06bc494ca11e Initial load
duke
parents:
diff changeset
   976
        public Name getQualifiedName() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   977
            return fullname;
06bc494ca11e Initial load
duke
parents:
diff changeset
   978
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   979
06bc494ca11e Initial load
duke
parents:
diff changeset
   980
        public Name flatName() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   981
            return flatname;
06bc494ca11e Initial load
duke
parents:
diff changeset
   982
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   983
06bc494ca11e Initial load
duke
parents:
diff changeset
   984
        public boolean isSubClass(Symbol base, Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   985
            if (this == base) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   986
                return true;
06bc494ca11e Initial load
duke
parents:
diff changeset
   987
            } else if ((base.flags() & INTERFACE) != 0) {
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
   988
                for (Type t = type; t.hasTag(CLASS); t = types.supertype(t))
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   989
                    for (List<Type> is = types.interfaces(t);
06bc494ca11e Initial load
duke
parents:
diff changeset
   990
                         is.nonEmpty();
06bc494ca11e Initial load
duke
parents:
diff changeset
   991
                         is = is.tail)
06bc494ca11e Initial load
duke
parents:
diff changeset
   992
                        if (is.head.tsym.isSubClass(base, types)) return true;
06bc494ca11e Initial load
duke
parents:
diff changeset
   993
            } else {
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
   994
                for (Type t = type; t.hasTag(CLASS); t = types.supertype(t))
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   995
                    if (t.tsym == base) return true;
06bc494ca11e Initial load
duke
parents:
diff changeset
   996
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
   997
            return false;
06bc494ca11e Initial load
duke
parents:
diff changeset
   998
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   999
06bc494ca11e Initial load
duke
parents:
diff changeset
  1000
        /** Complete the elaboration of this symbol's definition.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1001
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1002
        public void complete() throws CompletionFailure {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1003
            try {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1004
                super.complete();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1005
            } catch (CompletionFailure ex) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1006
                // quiet error recovery
06bc494ca11e Initial load
duke
parents:
diff changeset
  1007
                flags_field |= (PUBLIC|STATIC);
1257
873b053bf757 6557752: Original type of an AST should be made available even if it is replaced with an ErrorType
jjg
parents: 1045
diff changeset
  1008
                this.type = new ErrorType(this, Type.noType);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1009
                throw ex;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1010
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1011
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1012
06bc494ca11e Initial load
duke
parents:
diff changeset
  1013
        public List<Type> getInterfaces() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1014
            complete();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1015
            if (type instanceof ClassType) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1016
                ClassType t = (ClassType)type;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1017
                if (t.interfaces_field == null) // FIXME: shouldn't be null
06bc494ca11e Initial load
duke
parents:
diff changeset
  1018
                    t.interfaces_field = List.nil();
8625
6b51ef804d49 6639645: Modeling type implementing missing interfaces
jjg
parents: 8427
diff changeset
  1019
                if (t.all_interfaces_field != null)
6b51ef804d49 6639645: Modeling type implementing missing interfaces
jjg
parents: 8427
diff changeset
  1020
                    return Type.getModelTypes(t.all_interfaces_field);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1021
                return t.interfaces_field;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1022
            } else {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1023
                return List.nil();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1024
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1025
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1026
06bc494ca11e Initial load
duke
parents:
diff changeset
  1027
        public Type getSuperclass() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1028
            complete();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1029
            if (type instanceof ClassType) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1030
                ClassType t = (ClassType)type;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1031
                if (t.supertype_field == null) // FIXME: shouldn't be null
06bc494ca11e Initial load
duke
parents:
diff changeset
  1032
                    t.supertype_field = Type.noType;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1033
                // An interface has no superclass; its supertype is Object.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1034
                return t.isInterface()
06bc494ca11e Initial load
duke
parents:
diff changeset
  1035
                    ? Type.noType
8625
6b51ef804d49 6639645: Modeling type implementing missing interfaces
jjg
parents: 8427
diff changeset
  1036
                    : t.supertype_field.getModelType();
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1037
            } else {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1038
                return Type.noType;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1039
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1040
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1041
06bc494ca11e Initial load
duke
parents:
diff changeset
  1042
        public ElementKind getKind() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1043
            long flags = flags();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1044
            if ((flags & ANNOTATION) != 0)
06bc494ca11e Initial load
duke
parents:
diff changeset
  1045
                return ElementKind.ANNOTATION_TYPE;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1046
            else if ((flags & INTERFACE) != 0)
06bc494ca11e Initial load
duke
parents:
diff changeset
  1047
                return ElementKind.INTERFACE;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1048
            else if ((flags & ENUM) != 0)
06bc494ca11e Initial load
duke
parents:
diff changeset
  1049
                return ElementKind.ENUM;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1050
            else
06bc494ca11e Initial load
duke
parents:
diff changeset
  1051
                return ElementKind.CLASS;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1052
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1053
06bc494ca11e Initial load
duke
parents:
diff changeset
  1054
        public NestingKind getNestingKind() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1055
            complete();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1056
            if (owner.kind == PCK)
06bc494ca11e Initial load
duke
parents:
diff changeset
  1057
                return NestingKind.TOP_LEVEL;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1058
            else if (name.isEmpty())
06bc494ca11e Initial load
duke
parents:
diff changeset
  1059
                return NestingKind.ANONYMOUS;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1060
            else if (owner.kind == MTH)
06bc494ca11e Initial load
duke
parents:
diff changeset
  1061
                return NestingKind.LOCAL;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1062
            else
06bc494ca11e Initial load
duke
parents:
diff changeset
  1063
                return NestingKind.MEMBER;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1064
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1065
06bc494ca11e Initial load
duke
parents:
diff changeset
  1066
        /**
16557
67a3ae363f03 8007803: Implement javax.lang.model API for Type Annotations
jjg
parents: 16333
diff changeset
  1067
         * Since this method works in terms of the runtime representation
67a3ae363f03 8007803: Implement javax.lang.model API for Type Annotations
jjg
parents: 16333
diff changeset
  1068
         * of annotations, it should never be used by javac internally.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1069
         */
16557
67a3ae363f03 8007803: Implement javax.lang.model API for Type Annotations
jjg
parents: 16333
diff changeset
  1070
        @Override
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1071
        public <A extends java.lang.annotation.Annotation> A getAnnotation(Class<A> annoType) {
16557
67a3ae363f03 8007803: Implement javax.lang.model API for Type Annotations
jjg
parents: 16333
diff changeset
  1072
            return JavacAnnoConstructs.getAnnotation(this, annoType);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1073
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1074
06bc494ca11e Initial load
duke
parents:
diff changeset
  1075
        public <R, P> R accept(ElementVisitor<R, P> v, P p) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1076
            return v.visitType(this, p);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1077
        }
1357
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1078
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1079
        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1080
            return v.visitClassSymbol(this, p);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1081
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1082
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1083
06bc494ca11e Initial load
duke
parents:
diff changeset
  1084
06bc494ca11e Initial load
duke
parents:
diff changeset
  1085
    /** A class for variable symbols
06bc494ca11e Initial load
duke
parents:
diff changeset
  1086
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1087
    public static class VarSymbol extends Symbol implements VariableElement {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1088
06bc494ca11e Initial load
duke
parents:
diff changeset
  1089
        /** The variable's declaration position.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1090
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1091
        public int pos = Position.NOPOS;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1092
06bc494ca11e Initial load
duke
parents:
diff changeset
  1093
        /** The variable's address. Used for different purposes during
06bc494ca11e Initial load
duke
parents:
diff changeset
  1094
         *  flow analysis, translation and code generation.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1095
         *  Flow analysis:
06bc494ca11e Initial load
duke
parents:
diff changeset
  1096
         *    If this is a blank final or local variable, its sequence number.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1097
         *  Translation:
06bc494ca11e Initial load
duke
parents:
diff changeset
  1098
         *    If this is a private field, its access number.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1099
         *  Code generation:
06bc494ca11e Initial load
duke
parents:
diff changeset
  1100
         *    If this is a local variable, its logical slot number.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1101
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1102
        public int adr = -1;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1103
06bc494ca11e Initial load
duke
parents:
diff changeset
  1104
        /** Construct a variable symbol, given its flags, name, type and owner.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1105
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1106
        public VarSymbol(long flags, Name name, Type type, Symbol owner) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1107
            super(VAR, flags, name, type, owner);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1108
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1109
06bc494ca11e Initial load
duke
parents:
diff changeset
  1110
        /** Clone this symbol with new owner.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1111
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1112
        public VarSymbol clone(Symbol newOwner) {
14062
b7439971a094 7177386: Add attribution support for method references
mcimadamore
parents: 14051
diff changeset
  1113
            VarSymbol v = new VarSymbol(flags_field, name, type, newOwner) {
b7439971a094 7177386: Add attribution support for method references
mcimadamore
parents: 14051
diff changeset
  1114
                @Override
b7439971a094 7177386: Add attribution support for method references
mcimadamore
parents: 14051
diff changeset
  1115
                public Symbol baseSymbol() {
b7439971a094 7177386: Add attribution support for method references
mcimadamore
parents: 14051
diff changeset
  1116
                    return VarSymbol.this;
b7439971a094 7177386: Add attribution support for method references
mcimadamore
parents: 14051
diff changeset
  1117
                }
b7439971a094 7177386: Add attribution support for method references
mcimadamore
parents: 14051
diff changeset
  1118
            };
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1119
            v.pos = pos;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1120
            v.adr = adr;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1121
            v.data = data;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1122
//          System.out.println("clone " + v + " in " + newOwner);//DEBUG
06bc494ca11e Initial load
duke
parents:
diff changeset
  1123
            return v;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1124
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1125
06bc494ca11e Initial load
duke
parents:
diff changeset
  1126
        public String toString() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1127
            return name.toString();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1128
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1129
06bc494ca11e Initial load
duke
parents:
diff changeset
  1130
        public Symbol asMemberOf(Type site, Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1131
            return new VarSymbol(flags_field, name, types.memberType(site, this), owner);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1132
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1133
06bc494ca11e Initial load
duke
parents:
diff changeset
  1134
        public ElementKind getKind() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1135
            long flags = flags();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1136
            if ((flags & PARAMETER) != 0) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1137
                if (isExceptionParameter())
06bc494ca11e Initial load
duke
parents:
diff changeset
  1138
                    return ElementKind.EXCEPTION_PARAMETER;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1139
                else
06bc494ca11e Initial load
duke
parents:
diff changeset
  1140
                    return ElementKind.PARAMETER;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1141
            } else if ((flags & ENUM) != 0) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1142
                return ElementKind.ENUM_CONSTANT;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1143
            } else if (owner.kind == TYP || owner.kind == ERR) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1144
                return ElementKind.FIELD;
6718
56ed1962d369 6967842: Element not returned from tree API for ARM resource variables.
sundar
parents: 6592
diff changeset
  1145
            } else if (isResourceVariable()) {
56ed1962d369 6967842: Element not returned from tree API for ARM resource variables.
sundar
parents: 6592
diff changeset
  1146
                return ElementKind.RESOURCE_VARIABLE;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1147
            } else {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1148
                return ElementKind.LOCAL_VARIABLE;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1149
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1150
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1151
06bc494ca11e Initial load
duke
parents:
diff changeset
  1152
        public <R, P> R accept(ElementVisitor<R, P> v, P p) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1153
            return v.visitVariable(this, p);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1154
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1155
06bc494ca11e Initial load
duke
parents:
diff changeset
  1156
        public Object getConstantValue() { // Mirror API
06bc494ca11e Initial load
duke
parents:
diff changeset
  1157
            return Constants.decode(getConstValue(), type);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1158
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1159
06bc494ca11e Initial load
duke
parents:
diff changeset
  1160
        public void setLazyConstValue(final Env<AttrContext> env,
06bc494ca11e Initial load
duke
parents:
diff changeset
  1161
                                      final Attr attr,
06bc494ca11e Initial load
duke
parents:
diff changeset
  1162
                                      final JCTree.JCExpression initializer)
06bc494ca11e Initial load
duke
parents:
diff changeset
  1163
        {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1164
            setData(new Callable<Object>() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1165
                public Object call() {
8225
e9e5670e6a71 6554097: "final" confuses @SuppressWarnings
jjg
parents: 8032
diff changeset
  1166
                    return attr.attribLazyConstantValue(env, initializer, type);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1167
                }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1168
            });
06bc494ca11e Initial load
duke
parents:
diff changeset
  1169
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1170
06bc494ca11e Initial load
duke
parents:
diff changeset
  1171
        /**
06bc494ca11e Initial load
duke
parents:
diff changeset
  1172
         * The variable's constant value, if this is a constant.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1173
         * Before the constant value is evaluated, it points to an
06bc494ca11e Initial load
duke
parents:
diff changeset
  1174
         * initalizer environment.  If this is not a constant, it can
06bc494ca11e Initial load
duke
parents:
diff changeset
  1175
         * be used for other stuff.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1176
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1177
        private Object data;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1178
06bc494ca11e Initial load
duke
parents:
diff changeset
  1179
        public boolean isExceptionParameter() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1180
            return data == ElementKind.EXCEPTION_PARAMETER;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1181
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1182
6148
3a8158299c51 6911256: Project Coin: Support Automatic Resource Management (ARM) blocks in the compiler
darcy
parents: 5847
diff changeset
  1183
        public boolean isResourceVariable() {
3a8158299c51 6911256: Project Coin: Support Automatic Resource Management (ARM) blocks in the compiler
darcy
parents: 5847
diff changeset
  1184
            return data == ElementKind.RESOURCE_VARIABLE;
3a8158299c51 6911256: Project Coin: Support Automatic Resource Management (ARM) blocks in the compiler
darcy
parents: 5847
diff changeset
  1185
        }
3a8158299c51 6911256: Project Coin: Support Automatic Resource Management (ARM) blocks in the compiler
darcy
parents: 5847
diff changeset
  1186
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1187
        public Object getConstValue() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1188
            // TODO: Consider if getConstValue and getConstantValue can be collapsed
6148
3a8158299c51 6911256: Project Coin: Support Automatic Resource Management (ARM) blocks in the compiler
darcy
parents: 5847
diff changeset
  1189
            if (data == ElementKind.EXCEPTION_PARAMETER ||
3a8158299c51 6911256: Project Coin: Support Automatic Resource Management (ARM) blocks in the compiler
darcy
parents: 5847
diff changeset
  1190
                data == ElementKind.RESOURCE_VARIABLE) {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1191
                return null;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1192
            } else if (data instanceof Callable<?>) {
6148
3a8158299c51 6911256: Project Coin: Support Automatic Resource Management (ARM) blocks in the compiler
darcy
parents: 5847
diff changeset
  1193
                // In this case, this is a final variable, with an as
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1194
                // yet unevaluated initializer.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1195
                Callable<?> eval = (Callable<?>)data;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1196
                data = null; // to make sure we don't evaluate this twice.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1197
                try {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1198
                    data = eval.call();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1199
                } catch (Exception ex) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1200
                    throw new AssertionError(ex);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1201
                }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1202
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1203
            return data;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1204
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1205
06bc494ca11e Initial load
duke
parents:
diff changeset
  1206
        public void setData(Object data) {
8032
e1aa25ccdabb 6396503: javac should not require assertions enabled
jjg
parents: 8031
diff changeset
  1207
            Assert.check(!(data instanceof Env<?>), this);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1208
            this.data = data;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1209
        }
1357
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1210
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1211
        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1212
            return v.visitVarSymbol(this, p);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1213
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1214
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1215
06bc494ca11e Initial load
duke
parents:
diff changeset
  1216
    /** A class for method symbols.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1217
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1218
    public static class MethodSymbol extends Symbol implements ExecutableElement {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1219
06bc494ca11e Initial load
duke
parents:
diff changeset
  1220
        /** The code of the method. */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1221
        public Code code = null;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1222
15720
e61b2f7a5148 8006345: Report Synthesized Parameters in java.lang.reflect.Parameter API
mcimadamore
parents: 15719
diff changeset
  1223
        /** The extra (synthetic/mandated) parameters of the method. */
e61b2f7a5148 8006345: Report Synthesized Parameters in java.lang.reflect.Parameter API
mcimadamore
parents: 15719
diff changeset
  1224
        public List<VarSymbol> extraParams = List.nil();
e61b2f7a5148 8006345: Report Synthesized Parameters in java.lang.reflect.Parameter API
mcimadamore
parents: 15719
diff changeset
  1225
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1226
        /** The parameters of the method. */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1227
        public List<VarSymbol> params = null;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1228
06bc494ca11e Initial load
duke
parents:
diff changeset
  1229
        /** The names of the parameters */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1230
        public List<Name> savedParameterNames;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1231
06bc494ca11e Initial load
duke
parents:
diff changeset
  1232
        /** For an attribute field accessor, its default value if any.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1233
         *  The value is null if none appeared in the method
06bc494ca11e Initial load
duke
parents:
diff changeset
  1234
         *  declaration.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1235
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1236
        public Attribute defaultValue = null;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1237
06bc494ca11e Initial load
duke
parents:
diff changeset
  1238
        /** Construct a method symbol, given its flags, name, type and owner.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1239
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1240
        public MethodSymbol(long flags, Name name, Type type, Symbol owner) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1241
            super(MTH, flags, name, type, owner);
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
  1242
            if (owner.type.hasTag(TYPEVAR)) Assert.error(owner + "." + name);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1243
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1244
06bc494ca11e Initial load
duke
parents:
diff changeset
  1245
        /** Clone this symbol with new owner.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1246
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1247
        public MethodSymbol clone(Symbol newOwner) {
14062
b7439971a094 7177386: Add attribution support for method references
mcimadamore
parents: 14051
diff changeset
  1248
            MethodSymbol m = new MethodSymbol(flags_field, name, type, newOwner) {
b7439971a094 7177386: Add attribution support for method references
mcimadamore
parents: 14051
diff changeset
  1249
                @Override
b7439971a094 7177386: Add attribution support for method references
mcimadamore
parents: 14051
diff changeset
  1250
                public Symbol baseSymbol() {
b7439971a094 7177386: Add attribution support for method references
mcimadamore
parents: 14051
diff changeset
  1251
                    return MethodSymbol.this;
b7439971a094 7177386: Add attribution support for method references
mcimadamore
parents: 14051
diff changeset
  1252
                }
b7439971a094 7177386: Add attribution support for method references
mcimadamore
parents: 14051
diff changeset
  1253
            };
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1254
            m.code = code;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1255
            return m;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1256
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1257
16970
0967fa88590b 8011383: Symbol.getModifiers omits ACC_ABSTRACT from interface with default methods
mcimadamore
parents: 16967
diff changeset
  1258
        @Override
0967fa88590b 8011383: Symbol.getModifiers omits ACC_ABSTRACT from interface with default methods
mcimadamore
parents: 16967
diff changeset
  1259
        public Set<Modifier> getModifiers() {
0967fa88590b 8011383: Symbol.getModifiers omits ACC_ABSTRACT from interface with default methods
mcimadamore
parents: 16967
diff changeset
  1260
            long flags = flags();
0967fa88590b 8011383: Symbol.getModifiers omits ACC_ABSTRACT from interface with default methods
mcimadamore
parents: 16967
diff changeset
  1261
            return Flags.asModifierSet((flags & DEFAULT) != 0 ? flags & ~ABSTRACT : flags);
0967fa88590b 8011383: Symbol.getModifiers omits ACC_ABSTRACT from interface with default methods
mcimadamore
parents: 16967
diff changeset
  1262
        }
0967fa88590b 8011383: Symbol.getModifiers omits ACC_ABSTRACT from interface with default methods
mcimadamore
parents: 16967
diff changeset
  1263
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1264
        /** The Java source which this symbol represents.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1265
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1266
        public String toString() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1267
            if ((flags() & BLOCK) != 0) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1268
                return owner.name.toString();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1269
            } else {
1260
a772ba9ba43d 6574134: Allow for alternative implementation of Name Table with garbage collection of name bytes
jjg
parents: 1257
diff changeset
  1270
                String s = (name == name.table.names.init)
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1271
                    ? owner.name.toString()
06bc494ca11e Initial load
duke
parents:
diff changeset
  1272
                    : name.toString();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1273
                if (type != null) {
14359
d4099818ab70 7200915: convert TypeTags from a series of small ints to an enum
jjg
parents: 14258
diff changeset
  1274
                    if (type.hasTag(FORALL))
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1275
                        s = "<" + ((ForAll)type).getTypeArguments() + ">" + s;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1276
                    s += "(" + type.argtypes((flags() & VARARGS) != 0) + ")";
06bc494ca11e Initial load
duke
parents:
diff changeset
  1277
                }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1278
                return s;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1279
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1280
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1281
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1282
        public boolean isDynamic() {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1283
            return false;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1284
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1285
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1286
        /** find a symbol that this (proxy method) symbol implements.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1287
         *  @param    c       The class whose members are searched for
06bc494ca11e Initial load
duke
parents:
diff changeset
  1288
         *                    implementations
06bc494ca11e Initial load
duke
parents:
diff changeset
  1289
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1290
        public Symbol implemented(TypeSymbol c, Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1291
            Symbol impl = null;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1292
            for (List<Type> is = types.interfaces(c.type);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1293
                 impl == null && is.nonEmpty();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1294
                 is = is.tail) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1295
                TypeSymbol i = is.head.tsym;
7628
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1296
                impl = implementedIn(i, types);
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1297
                if (impl == null)
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1298
                    impl = implemented(i, types);
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1299
            }
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1300
            return impl;
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1301
        }
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1302
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1303
        public Symbol implementedIn(TypeSymbol c, Types types) {
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1304
            Symbol impl = null;
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1305
            for (Scope.Entry e = c.members().lookup(name);
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1306
                 impl == null && e.scope != null;
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1307
                 e = e.next()) {
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1308
                if (this.overrides(e.sym, (TypeSymbol)owner, types, true) &&
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1309
                    // FIXME: I suspect the following requires a
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1310
                    // subst() for a parametric return type.
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1311
                    types.isSameType(type.getReturnType(),
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1312
                                     types.memberType(owner.type, e.sym).getReturnType())) {
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 6718
diff changeset
  1313
                    impl = e.sym;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1314
                }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1315
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1316
            return impl;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1317
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1318
06bc494ca11e Initial load
duke
parents:
diff changeset
  1319
        /** Will the erasure of this method be considered by the VM to
06bc494ca11e Initial load
duke
parents:
diff changeset
  1320
         *  override the erasure of the other when seen from class `origin'?
06bc494ca11e Initial load
duke
parents:
diff changeset
  1321
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1322
        public boolean binaryOverrides(Symbol _other, TypeSymbol origin, Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1323
            if (isConstructor() || _other.kind != MTH) return false;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1324
06bc494ca11e Initial load
duke
parents:
diff changeset
  1325
            if (this == _other) return true;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1326
            MethodSymbol other = (MethodSymbol)_other;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1327
06bc494ca11e Initial load
duke
parents:
diff changeset
  1328
            // check for a direct implementation
06bc494ca11e Initial load
duke
parents:
diff changeset
  1329
            if (other.isOverridableIn((TypeSymbol)owner) &&
06bc494ca11e Initial load
duke
parents:
diff changeset
  1330
                types.asSuper(owner.type, other.owner) != null &&
06bc494ca11e Initial load
duke
parents:
diff changeset
  1331
                types.isSameType(erasure(types), other.erasure(types)))
06bc494ca11e Initial load
duke
parents:
diff changeset
  1332
                return true;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1333
06bc494ca11e Initial load
duke
parents:
diff changeset
  1334
            // check for an inherited implementation
06bc494ca11e Initial load
duke
parents:
diff changeset
  1335
            return
06bc494ca11e Initial load
duke
parents:
diff changeset
  1336
                (flags() & ABSTRACT) == 0 &&
06bc494ca11e Initial load
duke
parents:
diff changeset
  1337
                other.isOverridableIn(origin) &&
06bc494ca11e Initial load
duke
parents:
diff changeset
  1338
                this.isMemberOf(origin, types) &&
06bc494ca11e Initial load
duke
parents:
diff changeset
  1339
                types.isSameType(erasure(types), other.erasure(types));
06bc494ca11e Initial load
duke
parents:
diff changeset
  1340
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1341
06bc494ca11e Initial load
duke
parents:
diff changeset
  1342
        /** The implementation of this (abstract) symbol in class origin,
06bc494ca11e Initial load
duke
parents:
diff changeset
  1343
         *  from the VM's point of view, null if method does not have an
06bc494ca11e Initial load
duke
parents:
diff changeset
  1344
         *  implementation in class.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1345
         *  @param origin   The class of which the implementation is a member.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1346
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1347
        public MethodSymbol binaryImplementation(ClassSymbol origin, Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1348
            for (TypeSymbol c = origin; c != null; c = types.supertype(c.type).tsym) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1349
                for (Scope.Entry e = c.members().lookup(name);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1350
                     e.scope != null;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1351
                     e = e.next()) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1352
                    if (e.sym.kind == MTH &&
06bc494ca11e Initial load
duke
parents:
diff changeset
  1353
                        ((MethodSymbol)e.sym).binaryOverrides(this, origin, types))
06bc494ca11e Initial load
duke
parents:
diff changeset
  1354
                        return (MethodSymbol)e.sym;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1355
                }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1356
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1357
            return null;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1358
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1359
06bc494ca11e Initial load
duke
parents:
diff changeset
  1360
        /** Does this symbol override `other' symbol, when both are seen as
06bc494ca11e Initial load
duke
parents:
diff changeset
  1361
         *  members of class `origin'?  It is assumed that _other is a member
06bc494ca11e Initial load
duke
parents:
diff changeset
  1362
         *  of origin.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1363
         *
06bc494ca11e Initial load
duke
parents:
diff changeset
  1364
         *  It is assumed that both symbols have the same name.  The static
06bc494ca11e Initial load
duke
parents:
diff changeset
  1365
         *  modifier is ignored for this test.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1366
         *
06bc494ca11e Initial load
duke
parents:
diff changeset
  1367
         *  See JLS 8.4.6.1 (without transitivity) and 8.4.6.4
06bc494ca11e Initial load
duke
parents:
diff changeset
  1368
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1369
        public boolean overrides(Symbol _other, TypeSymbol origin, Types types, boolean checkResult) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1370
            if (isConstructor() || _other.kind != MTH) return false;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1371
06bc494ca11e Initial load
duke
parents:
diff changeset
  1372
            if (this == _other) return true;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1373
            MethodSymbol other = (MethodSymbol)_other;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1374
06bc494ca11e Initial load
duke
parents:
diff changeset
  1375
            // check for a direct implementation
06bc494ca11e Initial load
duke
parents:
diff changeset
  1376
            if (other.isOverridableIn((TypeSymbol)owner) &&
06bc494ca11e Initial load
duke
parents:
diff changeset
  1377
                types.asSuper(owner.type, other.owner) != null) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1378
                Type mt = types.memberType(owner.type, this);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1379
                Type ot = types.memberType(owner.type, other);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1380
                if (types.isSubSignature(mt, ot)) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1381
                    if (!checkResult)
06bc494ca11e Initial load
duke
parents:
diff changeset
  1382
                        return true;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1383
                    if (types.returnTypeSubstitutable(mt, ot))
06bc494ca11e Initial load
duke
parents:
diff changeset
  1384
                        return true;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1385
                }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1386
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1387
06bc494ca11e Initial load
duke
parents:
diff changeset
  1388
            // check for an inherited implementation
06bc494ca11e Initial load
duke
parents:
diff changeset
  1389
            if ((flags() & ABSTRACT) != 0 ||
14547
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents: 14443
diff changeset
  1390
                    ((other.flags() & ABSTRACT) == 0 && (other.flags() & DEFAULT) == 0) ||
14443
91c05eb19277 7192246: Add type-checking support for default methods
mcimadamore
parents: 14359
diff changeset
  1391
                    !other.isOverridableIn(origin) ||
91c05eb19277 7192246: Add type-checking support for default methods
mcimadamore
parents: 14359
diff changeset
  1392
                    !this.isMemberOf(origin, types))
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1393
                return false;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1394
06bc494ca11e Initial load
duke
parents:
diff changeset
  1395
            // assert types.asSuper(origin.type, other.owner) != null;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1396
            Type mt = types.memberType(origin.type, this);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1397
            Type ot = types.memberType(origin.type, other);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1398
            return
06bc494ca11e Initial load
duke
parents:
diff changeset
  1399
                types.isSubSignature(mt, ot) &&
14547
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents: 14443
diff changeset
  1400
                (!checkResult || types.resultSubtype(mt, ot, types.noWarnings));
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1401
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1402
06bc494ca11e Initial load
duke
parents:
diff changeset
  1403
        private boolean isOverridableIn(TypeSymbol origin) {
9303
eae35c201e19 7032975: API files in javax.annotation.processing need to be updated for references to JLS
jjh
parents: 8625
diff changeset
  1404
            // JLS 8.4.6.1
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1405
            switch ((int)(flags_field & Flags.AccessFlags)) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1406
            case Flags.PRIVATE:
06bc494ca11e Initial load
duke
parents:
diff changeset
  1407
                return false;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1408
            case Flags.PUBLIC:
15377
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1409
                return !this.owner.isInterface() ||
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1410
                        (flags_field & STATIC) == 0;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1411
            case Flags.PROTECTED:
06bc494ca11e Initial load
duke
parents:
diff changeset
  1412
                return (origin.flags() & INTERFACE) == 0;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1413
            case 0:
06bc494ca11e Initial load
duke
parents:
diff changeset
  1414
                // for package private: can only override in the same
06bc494ca11e Initial load
duke
parents:
diff changeset
  1415
                // package
06bc494ca11e Initial load
duke
parents:
diff changeset
  1416
                return
06bc494ca11e Initial load
duke
parents:
diff changeset
  1417
                    this.packge() == origin.packge() &&
06bc494ca11e Initial load
duke
parents:
diff changeset
  1418
                    (origin.flags() & INTERFACE) == 0;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1419
            default:
06bc494ca11e Initial load
duke
parents:
diff changeset
  1420
                return false;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1421
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1422
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1423
15377
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1424
        @Override
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1425
        public boolean isInheritedIn(Symbol clazz, Types types) {
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1426
            switch ((int)(flags_field & Flags.AccessFlags)) {
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1427
                case PUBLIC:
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1428
                    return !this.owner.isInterface() ||
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1429
                            clazz == owner ||
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1430
                            (flags_field & STATIC) == 0;
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1431
                default:
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1432
                    return super.isInheritedIn(clazz, types);
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1433
            }
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1434
        }
515846bb6637 8005166: Add support for static interface methods
mcimadamore
parents: 15355
diff changeset
  1435
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1436
        /** The implementation of this (abstract) symbol in class origin;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1437
         *  null if none exists. Synthetic methods are not considered
06bc494ca11e Initial load
duke
parents:
diff changeset
  1438
         *  as possible implementations.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1439
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1440
        public MethodSymbol implementation(TypeSymbol origin, Types types, boolean checkResult) {
6591
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 6584
diff changeset
  1441
            return implementation(origin, types, checkResult, implementation_filter);
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 6584
diff changeset
  1442
        }
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 6584
diff changeset
  1443
        // where
16320
92ba27b7aaf3 8008436: javac should not issue a warning for overriding equals without hasCode if hashCode has been overriden by a superclass
vromero
parents: 15720
diff changeset
  1444
            public static final Filter<Symbol> implementation_filter = new Filter<Symbol>() {
6591
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 6584
diff changeset
  1445
                public boolean accepts(Symbol s) {
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 6584
diff changeset
  1446
                    return s.kind == Kinds.MTH &&
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 6584
diff changeset
  1447
                            (s.flags() & SYNTHETIC) == 0;
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 6584
diff changeset
  1448
                }
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 6584
diff changeset
  1449
            };
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 6584
diff changeset
  1450
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 6584
diff changeset
  1451
        public MethodSymbol implementation(TypeSymbol origin, Types types, boolean checkResult, Filter<Symbol> implFilter) {
8242
3873b4aaf4a8 7007615: java_util/generics/phase2/NameClashTest02 fails since jdk7/pit/b123.
mcimadamore
parents: 8225
diff changeset
  1452
            MethodSymbol res = types.implementation(this, origin, checkResult, implFilter);
3539
3c265cb6f4e0 6827648: Extremely slow compilation time for visitor pattern code + generics
mcimadamore
parents: 3149
diff changeset
  1453
            if (res != null)
3c265cb6f4e0 6827648: Extremely slow compilation time for visitor pattern code + generics
mcimadamore
parents: 3149
diff changeset
  1454
                return res;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1455
            // if origin is derived from a raw type, we might have missed
06bc494ca11e Initial load
duke
parents:
diff changeset
  1456
            // an implementation because we do not know enough about instantiations.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1457
            // in this case continue with the supertype as origin.
12083
c9d98f7e59e8 7148556: Implementing a generic interface causes a public clone() to become inaccessible
mcimadamore
parents: 10627
diff changeset
  1458
            if (types.isDerivedRaw(origin.type) && !origin.isInterface())
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1459
                return implementation(types.supertype(origin.type).tsym, types, checkResult);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1460
            else
06bc494ca11e Initial load
duke
parents:
diff changeset
  1461
                return null;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1462
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1463
06bc494ca11e Initial load
duke
parents:
diff changeset
  1464
        public List<VarSymbol> params() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1465
            owner.complete();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1466
            if (params == null) {
4077
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1467
                // If ClassReader.saveParameterNames has been set true, then
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1468
                // savedParameterNames will be set to a list of names that
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1469
                // matches the types in type.getParameterTypes().  If any names
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1470
                // were not found in the class file, those names in the list will
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1471
                // be set to the empty name.
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1472
                // If ClassReader.saveParameterNames has been set false, then
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1473
                // savedParameterNames will be null.
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1474
                List<Name> paramNames = savedParameterNames;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1475
                savedParameterNames = null;
4077
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1476
                // discard the provided names if the list of names is the wrong size.
15031
c4fad55a5681 8004727: Add compiler support for parameter reflection
jjg
parents: 14961
diff changeset
  1477
                if (paramNames == null || paramNames.size() != type.getParameterTypes().size()) {
4077
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1478
                    paramNames = List.nil();
15031
c4fad55a5681 8004727: Add compiler support for parameter reflection
jjg
parents: 14961
diff changeset
  1479
                }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1480
                ListBuffer<VarSymbol> buf = new ListBuffer<VarSymbol>();
4077
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1481
                List<Name> remaining = paramNames;
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1482
                // assert: remaining and paramNames are both empty or both
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1483
                // have same cardinality as type.getParameterTypes()
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1484
                int i = 0;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1485
                for (Type t : type.getParameterTypes()) {
4077
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1486
                    Name paramName;
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1487
                    if (remaining.isEmpty()) {
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1488
                        // no names for any parameters available
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1489
                        paramName = createArgName(i, paramNames);
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1490
                    } else {
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1491
                        paramName = remaining.head;
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1492
                        remaining = remaining.tail;
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1493
                        if (paramName.isEmpty()) {
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1494
                            // no name for this specific parameter
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1495
                            paramName = createArgName(i, paramNames);
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1496
                        }
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1497
                    }
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1498
                    buf.append(new VarSymbol(PARAMETER, paramName, t, this));
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1499
                    i++;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1500
                }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1501
                params = buf.toList();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1502
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1503
            return params;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1504
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1505
4077
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1506
        // Create a name for the argument at position 'index' that is not in
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1507
        // the exclude list. In normal use, either no names will have been
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1508
        // provided, in which case the exclude list is empty, or all the names
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1509
        // will have been provided, in which case this method will not be called.
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1510
        private Name createArgName(int index, List<Name> exclude) {
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1511
            String prefix = "arg";
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1512
            while (true) {
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1513
                Name argName = name.table.fromString(prefix + index);
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1514
                if (!exclude.contains(argName))
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1515
                    return argName;
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1516
                prefix += "$";
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1517
            }
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1518
        }
0096541a388e 6889255: javac MethodSymbol throws NPE if ClassReader does not read parameter names correctly
jjg
parents: 3539
diff changeset
  1519
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1520
        public Symbol asMemberOf(Type site, Types types) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1521
            return new MethodSymbol(flags_field, name, types.memberType(site, this), owner);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1522
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1523
06bc494ca11e Initial load
duke
parents:
diff changeset
  1524
        public ElementKind getKind() {
1260
a772ba9ba43d 6574134: Allow for alternative implementation of Name Table with garbage collection of name bytes
jjg
parents: 1257
diff changeset
  1525
            if (name == name.table.names.init)
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1526
                return ElementKind.CONSTRUCTOR;
1260
a772ba9ba43d 6574134: Allow for alternative implementation of Name Table with garbage collection of name bytes
jjg
parents: 1257
diff changeset
  1527
            else if (name == name.table.names.clinit)
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1528
                return ElementKind.STATIC_INIT;
10626
83f0c2860f5b 7086595: Error message bug: name of initializer is 'null'
mcimadamore
parents: 9812
diff changeset
  1529
            else if ((flags() & BLOCK) != 0)
83f0c2860f5b 7086595: Error message bug: name of initializer is 'null'
mcimadamore
parents: 9812
diff changeset
  1530
                return isStatic() ? ElementKind.STATIC_INIT : ElementKind.INSTANCE_INIT;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1531
            else
06bc494ca11e Initial load
duke
parents:
diff changeset
  1532
                return ElementKind.METHOD;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1533
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1534
10626
83f0c2860f5b 7086595: Error message bug: name of initializer is 'null'
mcimadamore
parents: 9812
diff changeset
  1535
        public boolean isStaticOrInstanceInit() {
83f0c2860f5b 7086595: Error message bug: name of initializer is 'null'
mcimadamore
parents: 9812
diff changeset
  1536
            return getKind() == ElementKind.STATIC_INIT ||
83f0c2860f5b 7086595: Error message bug: name of initializer is 'null'
mcimadamore
parents: 9812
diff changeset
  1537
                    getKind() == ElementKind.INSTANCE_INIT;
83f0c2860f5b 7086595: Error message bug: name of initializer is 'null'
mcimadamore
parents: 9812
diff changeset
  1538
        }
83f0c2860f5b 7086595: Error message bug: name of initializer is 'null'
mcimadamore
parents: 9812
diff changeset
  1539
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1540
        public Attribute getDefaultValue() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1541
            return defaultValue;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1542
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1543
15385
ee1eebe7e210 8006775: JSR 308: Compiler changes in JDK8
jjg
parents: 15377
diff changeset
  1544
        public List<VarSymbol> getParameters() {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1545
            return params();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1546
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1547
06bc494ca11e Initial load
duke
parents:
diff changeset
  1548
        public boolean isVarArgs() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1549
            return (flags() & VARARGS) != 0;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1550
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1551
14956
185bd7c693d8 8005046: Provide checking for a default method in javax.lang.model
darcy
parents: 14547
diff changeset
  1552
        public boolean isDefault() {
185bd7c693d8 8005046: Provide checking for a default method in javax.lang.model
darcy
parents: 14547
diff changeset
  1553
            return (flags() & DEFAULT) != 0;
185bd7c693d8 8005046: Provide checking for a default method in javax.lang.model
darcy
parents: 14547
diff changeset
  1554
        }
185bd7c693d8 8005046: Provide checking for a default method in javax.lang.model
darcy
parents: 14547
diff changeset
  1555
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1556
        public <R, P> R accept(ElementVisitor<R, P> v, P p) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1557
            return v.visitExecutable(this, p);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1558
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1559
1357
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1560
        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1561
            return v.visitMethodSymbol(this, p);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1562
        }
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1563
16557
67a3ae363f03 8007803: Implement javax.lang.model API for Type Annotations
jjg
parents: 16333
diff changeset
  1564
        public Type getReceiverType() {
67a3ae363f03 8007803: Implement javax.lang.model API for Type Annotations
jjg
parents: 16333
diff changeset
  1565
            return asType().getReceiverType();
67a3ae363f03 8007803: Implement javax.lang.model API for Type Annotations
jjg
parents: 16333
diff changeset
  1566
        }
67a3ae363f03 8007803: Implement javax.lang.model API for Type Annotations
jjg
parents: 16333
diff changeset
  1567
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1568
        public Type getReturnType() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1569
            return asType().getReturnType();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1570
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1571
06bc494ca11e Initial load
duke
parents:
diff changeset
  1572
        public List<Type> getThrownTypes() {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1573
            return asType().getThrownTypes();
06bc494ca11e Initial load
duke
parents:
diff changeset
  1574
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1575
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1576
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1577
    /** A class for invokedynamic method calls.
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1578
     */
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1579
    public static class DynamicMethodSymbol extends MethodSymbol {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1580
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1581
        public Object[] staticArgs;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1582
        public Symbol bsm;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1583
        public int bsmKind;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1584
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1585
        public DynamicMethodSymbol(Name name, Symbol owner, int bsmKind, MethodSymbol bsm, Type type, Object[] staticArgs) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1586
            super(0, name, type, owner);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1587
            this.bsm = bsm;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1588
            this.bsmKind = bsmKind;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1589
            this.staticArgs = staticArgs;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1590
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1591
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1592
        @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1593
        public boolean isDynamic() {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1594
            return true;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1595
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1596
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents: 13689
diff changeset
  1597
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1598
    /** A class for predefined operators.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1599
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1600
    public static class OperatorSymbol extends MethodSymbol {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1601
06bc494ca11e Initial load
duke
parents:
diff changeset
  1602
        public int opcode;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1603
06bc494ca11e Initial load
duke
parents:
diff changeset
  1604
        public OperatorSymbol(Name name, Type type, int opcode, Symbol owner) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1605
            super(PUBLIC | STATIC, name, type, owner);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1606
            this.opcode = opcode;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1607
        }
1357
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1608
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1609
        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1610
            return v.visitOperatorSymbol(this, p);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1611
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1612
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1613
06bc494ca11e Initial load
duke
parents:
diff changeset
  1614
    /** Symbol completer interface.
06bc494ca11e Initial load
duke
parents:
diff changeset
  1615
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
  1616
    public static interface Completer {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1617
        void complete(Symbol sym) throws CompletionFailure;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1618
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1619
06bc494ca11e Initial load
duke
parents:
diff changeset
  1620
    public static class CompletionFailure extends RuntimeException {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1621
        private static final long serialVersionUID = 0;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1622
        public Symbol sym;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1623
169
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1624
        /** A diagnostic object describing the failure
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1625
         */
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1626
        public JCDiagnostic diag;
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1627
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1628
        /** A localized string describing the failure.
169
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1629
         * @deprecated Use {@code getDetail()} or {@code getMessage()}
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1630
         */
169
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1631
        @Deprecated
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1632
        public String errmsg;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1633
06bc494ca11e Initial load
duke
parents:
diff changeset
  1634
        public CompletionFailure(Symbol sym, String errmsg) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1635
            this.sym = sym;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1636
            this.errmsg = errmsg;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1637
//          this.printStackTrace();//DEBUG
06bc494ca11e Initial load
duke
parents:
diff changeset
  1638
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1639
169
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1640
        public CompletionFailure(Symbol sym, JCDiagnostic diag) {
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1641
            this.sym = sym;
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1642
            this.diag = diag;
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1643
//          this.printStackTrace();//DEBUG
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1644
        }
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1645
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1646
        public JCDiagnostic getDiagnostic() {
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1647
            return diag;
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1648
        }
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1649
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1650
        @Override
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1651
        public String getMessage() {
169
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1652
            if (diag != null)
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1653
                return diag.getMessage(null);
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1654
            else
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1655
                return errmsg;
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1656
        }
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1657
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1658
        public Object getDetailValue() {
ff76730e430e 6668794: javac puts localized text in raw diagnostics
jjg
parents: 10
diff changeset
  1659
            return (diag != null ? diag : errmsg);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1660
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1661
06bc494ca11e Initial load
duke
parents:
diff changeset
  1662
        @Override
06bc494ca11e Initial load
duke
parents:
diff changeset
  1663
        public CompletionFailure initCause(Throwable cause) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1664
            super.initCause(cause);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1665
            return this;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1666
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1667
06bc494ca11e Initial load
duke
parents:
diff changeset
  1668
    }
1357
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1669
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1670
    /**
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1671
     * A visitor for symbols.  A visitor is used to implement operations
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1672
     * (or relations) on symbols.  Most common operations on types are
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1673
     * binary relations and this interface is designed for binary
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1674
     * relations, that is, operations on the form
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1675
     * Symbol&nbsp;&times;&nbsp;P&nbsp;&rarr;&nbsp;R.
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1676
     * <!-- In plain text: Type x P -> R -->
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1677
     *
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1678
     * @param <R> the return type of the operation implemented by this
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1679
     * visitor; use Void if no return type is needed.
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1680
     * @param <P> the type of the second argument (the first being the
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1681
     * symbol itself) of the operation implemented by this visitor; use
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1682
     * Void if a second argument is not needed.
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1683
     */
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1684
    public interface Visitor<R,P> {
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1685
        R visitClassSymbol(ClassSymbol s, P arg);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1686
        R visitMethodSymbol(MethodSymbol s, P arg);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1687
        R visitPackageSymbol(PackageSymbol s, P arg);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1688
        R visitOperatorSymbol(OperatorSymbol s, P arg);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1689
        R visitVarSymbol(VarSymbol s, P arg);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1690
        R visitTypeSymbol(TypeSymbol s, P arg);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1691
        R visitSymbol(Symbol s, P arg);
e2d4f3e1f805 6735840: Need a type/symbol visitor printer
mcimadamore
parents: 1260
diff changeset
  1692
    }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1693
}