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 arguments to current function applications boxed into an array for varargs? 96 */ 97 Resolve.MethodResolutionPhase pendingResolutionPhase = null; 98 99 /** A record of the lint/SuppressWarnings currently in effect 100 */ 101 Lint lint; 102 103 /** The variable whose initializer is being attributed 104 * useful for detecting self-references in variable initializers 105 */ 106 Symbol enclVar = null; 107 108 /** ResultInfo to be used for attributing 'return' statement expressions 109 * (set by Attr.visitMethod and Attr.visitLambda) 110 */ 111 Attr.ResultInfo returnResult = null; 112 113 /** ResultInfo to be used for attributing 'yield' statement expressions 114 * (set by Attr.visitSwitchExpression) 115 */ 116 Attr.ResultInfo yieldResult = null; 117 118 /** Symbol corresponding to the site of a qualified default super call 119 */ 120 Type defaultSuperCallSite = null; 121 122 /** Tree that when non null, is to be preferentially used in diagnostics. 123 * Usually Env<AttrContext>.tree is the tree to be referred to in messages, 124 * but this may not be true during the window a method is looked up in enclosing 125 * contexts (JDK-8145466) 126 */ 127 JCTree preferredTreeForDiagnostics; 128 129 /** Duplicate this context, replacing scope field and copying all others. 130 */ 131 AttrContext dup(WriteableScope scope) { 132 AttrContext info = new AttrContext(); 133 info.scope = scope; 134 info.staticLevel = staticLevel; 135 info.ctorPrologue = ctorPrologue; 136 info.selectSuper = selectSuper; 137 info.pendingResolutionPhase = pendingResolutionPhase; 138 info.lint = lint; 139 info.enclVar = enclVar; 140 info.returnResult = returnResult; 141 info.yieldResult = yieldResult; 142 info.defaultSuperCallSite = defaultSuperCallSite; 143 info.isSerializable = isSerializable; 144 info.isLambda = isLambda; 145 info.isSerializableLambda = isSerializableLambda; 146 info.attributionMode = attributionMode; 147 info.isAnonymousDiamond = isAnonymousDiamond; 148 info.isNewClass = isNewClass; 149 info.preferredTreeForDiagnostics = preferredTreeForDiagnostics; 150 info.visitingServiceImplementation = visitingServiceImplementation; 151 info.allowProtectedAccess = allowProtectedAccess; 152 return info; 153 } 154 155 /** Duplicate this context, copying all fields. 156 */ 157 AttrContext dup() { 158 return dup(scope); 159 } 160 161 public Iterable<Symbol> getLocalElements() { 162 if (scope == null) 163 return List.nil(); 164 return scope.getSymbols(); 165 } 166 167 boolean lastResolveVarargs() { 168 return pendingResolutionPhase != null && 169 pendingResolutionPhase.isVarargsRequired(); 170 } 171 172 @Override 173 public String toString() { 174 return "AttrContext[" + scope.toString() + "]"; 175 } 176 }