1 /*
2  * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package com.sun.tools.javac.comp;
27 
28 import com.sun.tools.javac.tree.JCTree;
29 import com.sun.tools.javac.util.*;
30 import com.sun.tools.javac.code.*;
31 
32 /** Contains information specific to the attribute and enter
33  *  passes, to be used in place of the generic field in environments.
34  *
35  *  <p><b>This is NOT part of any supported API.
36  *  If you write code that depends on this, you do so at your own risk.
37  *  This code and its internal interfaces are subject to change or
38  *  deletion without notice.</b>
39  */
40 public class AttrContext {
41 
42     /** The scope of local symbols.
43      */
44     Scope scope = null;
45 
46     /** The number of enclosing `static' modifiers.
47      */
48     int staticLevel = 0;
49 
50     /** Is this an environment for a this(...) or super(...) call?
51      */
52     boolean isSelfCall = false;
53 
54     /** Are we evaluating the selector of a `super' or type name?
55      */
56     boolean selectSuper = false;
57 
58     /** Is the current target of lambda expression or method reference serializable?
59      */
60     boolean isSerializable = false;
61 
62     /** Are arguments to current function applications boxed into an array for varargs?
63      */
64     Resolve.MethodResolutionPhase pendingResolutionPhase = null;
65 
66     /** A record of the lint/SuppressWarnings currently in effect
67      */
68     Lint lint;
69 
70     /** The variable whose initializer is being attributed
71      * useful for detecting self-references in variable initializers
72      */
73     Symbol enclVar = null;
74 
75     /** ResultInfo to be used for attributing 'return' statement expressions
76      * (set by Attr.visitMethod and Attr.visitLambda)
77      */
78     Attr.ResultInfo returnResult = null;
79 
80     /** Symbol corresponding to the site of a qualified default super call
81      */
82     Type defaultSuperCallSite = null;
83 
84     /** Tree that when non null, is to be preferentially used in diagnostics.
85      *  Usually Env<AttrContext>.tree is the tree to be referred to in messages,
86      *  but this may not be true during the window a method is looked up in enclosing
87      *  contexts (JDK-8145466)
88      */
89     JCTree preferredTreeForDiagnostics;
90 
91     /** Duplicate this context, replacing scope field and copying all others.
92      */
dup(Scope scope)93     AttrContext dup(Scope scope) {
94         AttrContext info = new AttrContext();
95         info.scope = scope;
96         info.staticLevel = staticLevel;
97         info.isSelfCall = isSelfCall;
98         info.selectSuper = selectSuper;
99         info.pendingResolutionPhase = pendingResolutionPhase;
100         info.lint = lint;
101         info.enclVar = enclVar;
102         info.returnResult = returnResult;
103         info.defaultSuperCallSite = defaultSuperCallSite;
104         info.isSerializable = isSerializable;
105         info.preferredTreeForDiagnostics = preferredTreeForDiagnostics;
106         return info;
107     }
108 
109     /** Duplicate this context, copying all fields.
110      */
dup()111     AttrContext dup() {
112         return dup(scope);
113     }
114 
getLocalElements()115     public Iterable<Symbol> getLocalElements() {
116         if (scope == null)
117             return List.nil();
118         return scope.getElements();
119     }
120 
lastResolveVarargs()121     boolean lastResolveVarargs() {
122         return pendingResolutionPhase != null &&
123                 pendingResolutionPhase.isVarargsRequired();
124     }
125 
126     @Override
toString()127     public String toString() {
128         return "AttrContext[" + scope.toString() + "]";
129     }
130 }
131