1 /* 2 * Copyright (c) 1999, 2022, 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 import com.sun.tools.javac.code.Scope.WriteableScope; 32 import com.sun.tools.javac.comp.DeferredAttr.AttributionMode; 33 34 /** Contains information specific to the attribute and enter 35 * passes, to be used in place of the generic field in environments. 36 * 37 * <p><b>This is NOT part of any supported API. 38 * If you write code that depends on this, you do so at your own risk. 39 * This code and its internal interfaces are subject to change or 40 * deletion without notice.</b> 41 */ 42 public class AttrContext { 43 44 /** The scope of local symbols. 45 */ 46 WriteableScope scope = null; 47 48 /** The number of enclosing `static' modifiers. 49 */ 50 int staticLevel = 0; 51 52 /** Are we in the 'prologue' part of a constructor, prior to an explicit this()/super()? 53 */ 54 boolean ctorPrologue = false; 55 56 /** Are we evaluating the selector of a `super' or type name? 57 */ 58 boolean selectSuper = false; 59 60 /** Is the current target of lambda expression or method reference serializable or is this a 61 * serializable class? 62 */ 63 boolean isSerializable = false; 64 65 /** Is this a serializable lambda? 66 */ 67 boolean isSerializableLambda = false; 68 69 /** Is this a lambda environment? 70 */ 71 boolean isLambda = false; 72 73 /** Is this a speculative attribution environment? 74 */ 75 AttributionMode attributionMode = AttributionMode.FULL; 76 77 /** 78 * Is this an attribution environment for an anonymous class instantiated using <> ? 79 */ 80 boolean isAnonymousDiamond = false; 81 82 /** 83 * Is this an attribution environment for an instance creation expression? 84 */ 85 boolean isNewClass = false; 86 87 /** Indicate if the type being visited is a service implementation 88 */ 89 boolean visitingServiceImplementation = false; 90 91 /** Indicate protected access should be unconditionally allowed. 92 */ 93 boolean allowProtectedAccess = false; 94 95 /** Are we attributing a permits clause? 96 */ 97 boolean isPermitsClause = false; 98 99 /** Are arguments to current function applications boxed into an array for varargs? 100 */ 101 Resolve.MethodResolutionPhase pendingResolutionPhase = null; 102 103 /** A record of the lint/SuppressWarnings currently in effect 104 */ 105 Lint lint; 106 107 /** The variable whose initializer is being attributed 108 * useful for detecting self-references in variable initializers 109 */ 110 Symbol enclVar = null; 111 112 /** ResultInfo to be used for attributing 'return' statement expressions 113 * (set by Attr.visitMethod and Attr.visitLambda) 114 */ 115 Attr.ResultInfo returnResult = null; 116 117 /** ResultInfo to be used for attributing 'yield' statement expressions 118 * (set by Attr.visitSwitchExpression) 119 */ 120 Attr.ResultInfo yieldResult = null; 121 122 /** Symbol corresponding to the site of a qualified default super call 123 */ 124 Type defaultSuperCallSite = null; 125 126 /** Tree that when non null, is to be preferentially used in diagnostics. 127 * Usually Env<AttrContext>.tree is the tree to be referred to in messages, 128 * but this may not be true during the window a method is looked up in enclosing 129 * contexts (JDK-8145466) 130 */ 131 JCTree preferredTreeForDiagnostics; 132 133 boolean instanceInitializerBlock = false; 134 135 /** Duplicate this context, replacing scope field and copying all others. 136 */ 137 AttrContext dup(WriteableScope scope) { 138 AttrContext info = new AttrContext(); 139 info.scope = scope; 140 info.staticLevel = staticLevel; 141 info.ctorPrologue = ctorPrologue; 142 info.selectSuper = selectSuper; 143 info.pendingResolutionPhase = pendingResolutionPhase; 144 info.lint = lint; 145 info.enclVar = enclVar; 146 info.returnResult = returnResult; 147 info.yieldResult = yieldResult; 148 info.defaultSuperCallSite = defaultSuperCallSite; 149 info.isSerializable = isSerializable; 150 info.isLambda = isLambda; 151 info.isSerializableLambda = isSerializableLambda; 152 info.attributionMode = attributionMode; 153 info.isAnonymousDiamond = isAnonymousDiamond; 154 info.isNewClass = isNewClass; 155 info.preferredTreeForDiagnostics = preferredTreeForDiagnostics; 156 info.visitingServiceImplementation = visitingServiceImplementation; 157 info.allowProtectedAccess = allowProtectedAccess; 158 info.instanceInitializerBlock = instanceInitializerBlock; 159 info.isPermitsClause = isPermitsClause; 160 return info; 161 } 162 163 /** Duplicate this context, copying all fields. 164 */ 165 AttrContext dup() { 166 return dup(scope); 167 } 168 169 public Iterable<Symbol> getLocalElements() { 170 if (scope == null) 171 return List.nil(); 172 return scope.getSymbols(); 173 } 174 175 boolean lastResolveVarargs() { 176 return pendingResolutionPhase != null && 177 pendingResolutionPhase.isVarargsRequired(); 178 } 179 180 @Override 181 public String toString() { 182 return "AttrContext[" + scope.toString() + "]"; 183 } 184 }