1 /* 2 * Copyright (c) 2024, 2025, 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 java.util.HashMap; 29 import java.util.Map; 30 import java.util.Set; 31 import java.util.WeakHashMap; 32 33 import com.sun.tools.javac.util.List; 34 35 import com.sun.tools.javac.code.Symbol.ClassSymbol; 36 import com.sun.tools.javac.code.Symbol.VarSymbol; 37 import com.sun.tools.javac.tree.JCTree; 38 import com.sun.tools.javac.util.Context; 39 40 /** 41 * A Context class, that can keep useful information about unset fields. 42 * This information will be produced during flow analysis and used during 43 * code generation. 44 * 45 * <p><b>This is NOT part of any supported API. 46 * If you write code that depends on this, you do so at your own risk. 47 * This code and its internal interfaces are subject to change or 48 * deletion without notice.</b> 49 */ 50 public class UnsetFieldsInfo { 51 protected static final Context.Key<UnsetFieldsInfo> unsetFieldsInfoKey = new Context.Key<>(); 52 53 public static UnsetFieldsInfo instance(Context context) { 54 UnsetFieldsInfo instance = context.get(unsetFieldsInfoKey); 55 if (instance == null) 56 instance = new UnsetFieldsInfo(context); 57 return instance; 58 } 59 60 @SuppressWarnings("this-escape") 61 protected UnsetFieldsInfo(Context context) { 62 context.put(unsetFieldsInfoKey, this); 63 } 64 65 private WeakHashMap<ClassSymbol, Map<JCTree, Set<VarSymbol>>> unsetFieldsMap = new WeakHashMap<>(); 66 67 public void addUnsetFieldsInfo(ClassSymbol csym, JCTree tree, Set<VarSymbol> unsetFields) { 68 Map<JCTree, Set<VarSymbol>> treeToFieldsMap = unsetFieldsMap.get(csym); 69 if (treeToFieldsMap == null) { 70 treeToFieldsMap = new HashMap<>(); 71 treeToFieldsMap.put(tree, unsetFields); 72 unsetFieldsMap.put(csym, treeToFieldsMap); 73 } else { 74 if (!treeToFieldsMap.containsKey(tree)) { 75 // only add if there is no info for the given tree 76 treeToFieldsMap.put(tree, unsetFields); 77 } 78 } 79 } 80 81 public Set<VarSymbol> getUnsetFields(ClassSymbol csym, JCTree tree) { 82 Map<JCTree, Set<VarSymbol>> treeToFieldsMap = unsetFieldsMap.get(csym); 83 if (treeToFieldsMap != null) { 84 Set<VarSymbol> result = treeToFieldsMap.get(tree); 85 if (result != null) { 86 return result; 87 } 88 } 89 return null; 90 } 91 }