8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 25 package org.graalvm.compiler.nodes.graphbuilderconf; 26 27 import java.util.Arrays; 28 29 import org.graalvm.compiler.core.common.type.StampPair; 30 31 import jdk.vm.ci.meta.JavaType; 32 import jdk.vm.ci.meta.ResolvedJavaType; 33 34 public class GraphBuilderConfiguration { 35 36 public static class Plugins { 37 private final InvocationPlugins invocationPlugins; 38 private NodePlugin[] nodePlugins; 39 private ParameterPlugin[] parameterPlugins; 40 private TypePlugin[] typePlugins; 41 private InlineInvokePlugin[] inlineInvokePlugins; 42 private LoopExplosionPlugin loopExplosionPlugin; 43 private ClassInitializationPlugin classInitializationPlugin; 44 private InvokeDynamicPlugin invokeDynamicPlugin; 45 private ProfilingPlugin profilingPlugin; 46 47 /** 48 * Creates a copy of a given set of plugins. The {@link InvocationPlugins} in 49 * {@code copyFrom} become the {@linkplain InvocationPlugins#getParent() default} 50 * {@linkplain #getInvocationPlugins() invocation plugins} in this object. 51 */ 52 public Plugins(Plugins copyFrom) { 53 this.invocationPlugins = new InvocationPlugins(copyFrom.invocationPlugins); 54 this.nodePlugins = copyFrom.nodePlugins; 55 this.parameterPlugins = copyFrom.parameterPlugins; 56 this.typePlugins = copyFrom.typePlugins; 57 this.inlineInvokePlugins = copyFrom.inlineInvokePlugins; 58 this.loopExplosionPlugin = copyFrom.loopExplosionPlugin; 59 this.classInitializationPlugin = copyFrom.classInitializationPlugin; 60 this.invokeDynamicPlugin = copyFrom.invokeDynamicPlugin; 61 this.profilingPlugin = copyFrom.profilingPlugin; 62 } 63 64 /** 65 * Creates a new set of plugins. 66 * 67 * @param invocationPlugins the {@linkplain #getInvocationPlugins() invocation plugins} in 68 * this object 69 */ 70 public Plugins(InvocationPlugins invocationPlugins) { 71 this.invocationPlugins = invocationPlugins; 72 this.nodePlugins = new NodePlugin[0]; 73 this.parameterPlugins = new ParameterPlugin[0]; 74 this.typePlugins = new TypePlugin[0]; 75 this.inlineInvokePlugins = new InlineInvokePlugin[0]; 76 } 77 78 public InvocationPlugins getInvocationPlugins() { 79 return invocationPlugins; 80 } 81 82 public NodePlugin[] getNodePlugins() { 83 return nodePlugins; 138 public InlineInvokePlugin[] getInlineInvokePlugins() { 139 return inlineInvokePlugins; 140 } 141 142 public void appendInlineInvokePlugin(InlineInvokePlugin plugin) { 143 inlineInvokePlugins = Arrays.copyOf(inlineInvokePlugins, inlineInvokePlugins.length + 1); 144 inlineInvokePlugins[inlineInvokePlugins.length - 1] = plugin; 145 } 146 147 public void prependInlineInvokePlugin(InlineInvokePlugin plugin) { 148 InlineInvokePlugin[] newPlugins = new InlineInvokePlugin[inlineInvokePlugins.length + 1]; 149 System.arraycopy(inlineInvokePlugins, 0, newPlugins, 1, inlineInvokePlugins.length); 150 newPlugins[0] = plugin; 151 inlineInvokePlugins = newPlugins; 152 } 153 154 public void clearInlineInvokePlugins() { 155 inlineInvokePlugins = new InlineInvokePlugin[0]; 156 } 157 158 public LoopExplosionPlugin getLoopExplosionPlugin() { 159 return loopExplosionPlugin; 160 } 161 162 public void setLoopExplosionPlugin(LoopExplosionPlugin plugin) { 163 this.loopExplosionPlugin = plugin; 164 } 165 166 public ClassInitializationPlugin getClassInitializationPlugin() { 167 return classInitializationPlugin; 168 } 169 170 public void setClassInitializationPlugin(ClassInitializationPlugin plugin) { 171 this.classInitializationPlugin = plugin; 172 } 173 174 public InvokeDynamicPlugin getInvokeDynamicPlugin() { 175 return invokeDynamicPlugin; 176 } 177 178 public void setInvokeDynamicPlugin(InvokeDynamicPlugin plugin) { 179 this.invokeDynamicPlugin = plugin; 180 } 181 182 public ProfilingPlugin getProfilingPlugin() { 183 return profilingPlugin; 184 } 185 186 public void setProfilingPlugin(ProfilingPlugin plugin) { 187 this.profilingPlugin = plugin; 188 } 189 190 public StampPair getOverridingStamp(GraphBuilderTool b, JavaType type, boolean nonNull) { 191 for (TypePlugin plugin : getTypePlugins()) { 192 StampPair stamp = plugin.interceptType(b, type, nonNull); 193 if (stamp != null) { 194 return stamp; 195 } 196 } 197 return null; 198 } 199 } 200 201 private static final ResolvedJavaType[] EMPTY = new ResolvedJavaType[]{}; 202 203 private final boolean eagerResolving; 204 private final boolean unresolvedIsError; 205 private final BytecodeExceptionMode bytecodeExceptionMode; 206 private final boolean omitAssertions; 207 private final ResolvedJavaType[] skippedExceptionTypes; 208 private final boolean insertFullInfopoints; 209 private final boolean trackNodeSourcePosition; 210 private final Plugins plugins; 211 212 public enum BytecodeExceptionMode { 213 /** 214 * This mode always explicitly checks for exceptions. 215 */ 216 CheckAll, 217 /** 218 * This mode omits all explicit exception edges. 219 */ 220 OmitAll, 221 /** 222 * This mode omits exception edges at invokes, but not for implicit null checks or bounds 223 * checks. 224 */ 225 ExplicitOnly, 226 /** 227 * This mode uses profiling information to decide whether to use explicit exception edges. 228 */ 229 Profile 230 } 231 232 protected GraphBuilderConfiguration(boolean eagerResolving, boolean unresolvedIsError, BytecodeExceptionMode bytecodeExceptionMode, boolean omitAssertions, boolean insertFullInfopoints, 233 boolean trackNodeSourcePosition, ResolvedJavaType[] skippedExceptionTypes, Plugins plugins) { 234 this.eagerResolving = eagerResolving; 235 this.unresolvedIsError = unresolvedIsError; 236 this.bytecodeExceptionMode = bytecodeExceptionMode; 237 this.omitAssertions = omitAssertions; 238 this.insertFullInfopoints = insertFullInfopoints; 239 this.trackNodeSourcePosition = trackNodeSourcePosition; 240 this.skippedExceptionTypes = skippedExceptionTypes; 241 this.plugins = plugins; 242 } 243 244 /** 245 * Creates a copy of this configuration with all its plugins. The {@link InvocationPlugins} in 246 * this configuration become the {@linkplain InvocationPlugins#getParent() parent} of the 247 * {@link InvocationPlugins} in the copy. 248 */ 249 public GraphBuilderConfiguration copy() { 250 Plugins newPlugins = new Plugins(plugins); 251 GraphBuilderConfiguration result = new GraphBuilderConfiguration(eagerResolving, unresolvedIsError, bytecodeExceptionMode, omitAssertions, insertFullInfopoints, trackNodeSourcePosition, 252 skippedExceptionTypes, newPlugins); 253 return result; 254 } 255 256 /** 257 * Set the {@link #unresolvedIsError} flag. This flag can be set independently from 258 * {@link #eagerResolving}, i.e., even if eager resolving fails execution is assumed to be 259 * valid. This allows us for example to process unresolved types/methods/fields even when 260 * eagerly resolving elements. 261 */ 262 public GraphBuilderConfiguration withUnresolvedIsError(boolean newUnresolvedIsError) { 263 return new GraphBuilderConfiguration(eagerResolving, newUnresolvedIsError, bytecodeExceptionMode, omitAssertions, insertFullInfopoints, trackNodeSourcePosition, skippedExceptionTypes, 264 plugins); 265 } 266 267 public GraphBuilderConfiguration withEagerResolving(boolean newEagerResolving) { 268 return new GraphBuilderConfiguration(newEagerResolving, unresolvedIsError, bytecodeExceptionMode, omitAssertions, insertFullInfopoints, trackNodeSourcePosition, skippedExceptionTypes, 269 plugins); 270 } 271 272 public GraphBuilderConfiguration withSkippedExceptionTypes(ResolvedJavaType[] newSkippedExceptionTypes) { 273 return new GraphBuilderConfiguration(eagerResolving, unresolvedIsError, bytecodeExceptionMode, omitAssertions, insertFullInfopoints, trackNodeSourcePosition, newSkippedExceptionTypes, 274 plugins); 275 } 276 277 public GraphBuilderConfiguration withBytecodeExceptionMode(BytecodeExceptionMode newBytecodeExceptionMode) { 278 return new GraphBuilderConfiguration(eagerResolving, unresolvedIsError, newBytecodeExceptionMode, omitAssertions, insertFullInfopoints, trackNodeSourcePosition, skippedExceptionTypes, 279 plugins); 280 } 281 282 public GraphBuilderConfiguration withOmitAssertions(boolean newOmitAssertions) { 283 return new GraphBuilderConfiguration(eagerResolving, unresolvedIsError, bytecodeExceptionMode, newOmitAssertions, insertFullInfopoints, trackNodeSourcePosition, skippedExceptionTypes, 284 plugins); 285 } 286 287 public GraphBuilderConfiguration withFullInfopoints(boolean newInsertFullInfopoints) { 288 ResolvedJavaType[] newSkippedExceptionTypes = skippedExceptionTypes == EMPTY ? EMPTY : Arrays.copyOf(skippedExceptionTypes, skippedExceptionTypes.length); 289 return new GraphBuilderConfiguration(eagerResolving, unresolvedIsError, bytecodeExceptionMode, omitAssertions, newInsertFullInfopoints, trackNodeSourcePosition, newSkippedExceptionTypes, 290 plugins); 291 } 292 293 public GraphBuilderConfiguration withNodeSourcePosition(boolean newTrackNodeSourcePosition) { 294 ResolvedJavaType[] newSkippedExceptionTypes = skippedExceptionTypes == EMPTY ? EMPTY : Arrays.copyOf(skippedExceptionTypes, skippedExceptionTypes.length); 295 return new GraphBuilderConfiguration(eagerResolving, unresolvedIsError, bytecodeExceptionMode, omitAssertions, insertFullInfopoints, newTrackNodeSourcePosition, newSkippedExceptionTypes, 296 plugins); 297 } 298 299 public ResolvedJavaType[] getSkippedExceptionTypes() { 300 return skippedExceptionTypes; 301 } 302 303 public boolean eagerResolving() { 304 return eagerResolving; 305 } 306 307 public BytecodeExceptionMode getBytecodeExceptionMode() { 308 return bytecodeExceptionMode; 309 } 310 311 public boolean omitAssertions() { 312 return omitAssertions; 313 } 314 315 public boolean trackNodeSourcePosition() { 316 return trackNodeSourcePosition; 317 } 318 319 public boolean insertFullInfopoints() { 320 return insertFullInfopoints; 321 } 322 323 public static GraphBuilderConfiguration getDefault(Plugins plugins) { 324 return new GraphBuilderConfiguration(false, false, BytecodeExceptionMode.Profile, false, false, false, EMPTY, plugins); 325 } 326 327 public static GraphBuilderConfiguration getSnippetDefault(Plugins plugins) { 328 return new GraphBuilderConfiguration(true, true, BytecodeExceptionMode.OmitAll, false, false, false, EMPTY, plugins); 329 } 330 331 /** Returns {@code true} if it is an error for a class/field/method resolution to fail. */ 332 public boolean unresolvedIsError() { 333 return unresolvedIsError; 334 } 335 336 public Plugins getPlugins() { 337 return plugins; 338 } 339 } | 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 25 package org.graalvm.compiler.nodes.graphbuilderconf; 26 27 import java.util.Arrays; 28 import java.util.Collections; 29 import java.util.List; 30 31 import org.graalvm.compiler.core.common.type.StampPair; 32 33 import jdk.vm.ci.meta.JavaType; 34 import jdk.vm.ci.meta.ResolvedJavaType; 35 36 public final class GraphBuilderConfiguration { 37 38 public static class Plugins { 39 private final InvocationPlugins invocationPlugins; 40 private NodePlugin[] nodePlugins; 41 private ParameterPlugin[] parameterPlugins; 42 private TypePlugin[] typePlugins; 43 private InlineInvokePlugin[] inlineInvokePlugins; 44 private ClassInitializationPlugin classInitializationPlugin; 45 private InvokeDynamicPlugin invokeDynamicPlugin; 46 private ProfilingPlugin profilingPlugin; 47 48 /** 49 * Creates a copy of a given set of plugins. The {@link InvocationPlugins} in 50 * {@code copyFrom} become the {@linkplain InvocationPlugins#getParent() default} 51 * {@linkplain #getInvocationPlugins() invocation plugins} in this object. 52 */ 53 public Plugins(Plugins copyFrom, InvocationPlugins invocationPlugins) { 54 this.invocationPlugins = invocationPlugins != null ? invocationPlugins : new InvocationPlugins(copyFrom.invocationPlugins); 55 this.nodePlugins = copyFrom.nodePlugins; 56 this.parameterPlugins = copyFrom.parameterPlugins; 57 this.typePlugins = copyFrom.typePlugins; 58 this.inlineInvokePlugins = copyFrom.inlineInvokePlugins; 59 this.classInitializationPlugin = copyFrom.classInitializationPlugin; 60 this.invokeDynamicPlugin = copyFrom.invokeDynamicPlugin; 61 this.profilingPlugin = copyFrom.profilingPlugin; 62 } 63 64 public Plugins(Plugins copyFrom) { 65 this(copyFrom, null); 66 } 67 68 /** 69 * Creates a new set of plugins. 70 * 71 * @param invocationPlugins the {@linkplain #getInvocationPlugins() invocation plugins} in 72 * this object 73 */ 74 public Plugins(InvocationPlugins invocationPlugins) { 75 this.invocationPlugins = invocationPlugins; 76 this.nodePlugins = new NodePlugin[0]; 77 this.parameterPlugins = new ParameterPlugin[0]; 78 this.typePlugins = new TypePlugin[0]; 79 this.inlineInvokePlugins = new InlineInvokePlugin[0]; 80 } 81 82 public InvocationPlugins getInvocationPlugins() { 83 return invocationPlugins; 84 } 85 86 public NodePlugin[] getNodePlugins() { 87 return nodePlugins; 142 public InlineInvokePlugin[] getInlineInvokePlugins() { 143 return inlineInvokePlugins; 144 } 145 146 public void appendInlineInvokePlugin(InlineInvokePlugin plugin) { 147 inlineInvokePlugins = Arrays.copyOf(inlineInvokePlugins, inlineInvokePlugins.length + 1); 148 inlineInvokePlugins[inlineInvokePlugins.length - 1] = plugin; 149 } 150 151 public void prependInlineInvokePlugin(InlineInvokePlugin plugin) { 152 InlineInvokePlugin[] newPlugins = new InlineInvokePlugin[inlineInvokePlugins.length + 1]; 153 System.arraycopy(inlineInvokePlugins, 0, newPlugins, 1, inlineInvokePlugins.length); 154 newPlugins[0] = plugin; 155 inlineInvokePlugins = newPlugins; 156 } 157 158 public void clearInlineInvokePlugins() { 159 inlineInvokePlugins = new InlineInvokePlugin[0]; 160 } 161 162 public ClassInitializationPlugin getClassInitializationPlugin() { 163 return classInitializationPlugin; 164 } 165 166 public void setClassInitializationPlugin(ClassInitializationPlugin plugin) { 167 this.classInitializationPlugin = plugin; 168 } 169 170 public InvokeDynamicPlugin getInvokeDynamicPlugin() { 171 return invokeDynamicPlugin; 172 } 173 174 public void setInvokeDynamicPlugin(InvokeDynamicPlugin plugin) { 175 this.invokeDynamicPlugin = plugin; 176 } 177 178 public ProfilingPlugin getProfilingPlugin() { 179 return profilingPlugin; 180 } 181 182 public void setProfilingPlugin(ProfilingPlugin plugin) { 183 this.profilingPlugin = plugin; 184 } 185 186 public StampPair getOverridingStamp(GraphBuilderTool b, JavaType type, boolean nonNull) { 187 for (TypePlugin plugin : getTypePlugins()) { 188 StampPair stamp = plugin.interceptType(b, type, nonNull); 189 if (stamp != null) { 190 return stamp; 191 } 192 } 193 return null; 194 } 195 } 196 197 private final boolean eagerResolving; 198 private final boolean unresolvedIsError; 199 private final BytecodeExceptionMode bytecodeExceptionMode; 200 private final boolean omitAssertions; 201 private final List<ResolvedJavaType> skippedExceptionTypes; 202 private final boolean insertFullInfopoints; 203 private final boolean trackNodeSourcePosition; 204 private final Plugins plugins; 205 206 public enum BytecodeExceptionMode { 207 /** 208 * This mode always explicitly checks for exceptions. 209 */ 210 CheckAll, 211 /** 212 * This mode omits all explicit exception edges. 213 */ 214 OmitAll, 215 /** 216 * This mode omits exception edges at invokes, but not for implicit null checks or bounds 217 * checks. 218 */ 219 ExplicitOnly, 220 /** 221 * This mode uses profiling information to decide whether to use explicit exception edges. 222 */ 223 Profile 224 } 225 226 private GraphBuilderConfiguration(boolean eagerResolving, 227 boolean unresolvedIsError, 228 BytecodeExceptionMode bytecodeExceptionMode, 229 boolean omitAssertions, 230 boolean insertFullInfopoints, 231 boolean trackNodeSourcePosition, 232 List<ResolvedJavaType> skippedExceptionTypes, 233 Plugins plugins) { 234 this.eagerResolving = eagerResolving; 235 this.unresolvedIsError = unresolvedIsError; 236 this.bytecodeExceptionMode = bytecodeExceptionMode; 237 this.omitAssertions = omitAssertions; 238 this.insertFullInfopoints = insertFullInfopoints; 239 this.trackNodeSourcePosition = trackNodeSourcePosition; 240 this.skippedExceptionTypes = skippedExceptionTypes; 241 this.plugins = plugins; 242 } 243 244 /** 245 * Creates a copy of this configuration with all its plugins. The {@link InvocationPlugins} in 246 * this configuration become the {@linkplain InvocationPlugins#getParent() parent} of the 247 * {@link InvocationPlugins} in the copy. 248 */ 249 public GraphBuilderConfiguration copy() { 250 Plugins newPlugins = new Plugins(plugins); 251 GraphBuilderConfiguration result = new GraphBuilderConfiguration( 252 eagerResolving, 253 unresolvedIsError, 254 bytecodeExceptionMode, 255 omitAssertions, 256 insertFullInfopoints, 257 trackNodeSourcePosition, 258 skippedExceptionTypes, 259 newPlugins); 260 return result; 261 } 262 263 /** 264 * Set the {@link #unresolvedIsError} flag. This flag can be set independently from 265 * {@link #eagerResolving}, i.e., even if eager resolving fails execution is assumed to be 266 * valid. This allows us for example to process unresolved types/methods/fields even when 267 * eagerly resolving elements. 268 */ 269 public GraphBuilderConfiguration withUnresolvedIsError(boolean newUnresolvedIsError) { 270 return new GraphBuilderConfiguration( 271 eagerResolving, 272 newUnresolvedIsError, 273 bytecodeExceptionMode, 274 omitAssertions, 275 insertFullInfopoints, 276 trackNodeSourcePosition, 277 skippedExceptionTypes, 278 plugins); 279 } 280 281 public GraphBuilderConfiguration withEagerResolving(boolean newEagerResolving) { 282 return new GraphBuilderConfiguration( 283 newEagerResolving, 284 unresolvedIsError, 285 bytecodeExceptionMode, 286 omitAssertions, 287 insertFullInfopoints, 288 trackNodeSourcePosition, 289 skippedExceptionTypes, 290 plugins); 291 } 292 293 public GraphBuilderConfiguration withSkippedExceptionTypes(ResolvedJavaType[] newSkippedExceptionTypes) { 294 return new GraphBuilderConfiguration( 295 eagerResolving, 296 unresolvedIsError, 297 bytecodeExceptionMode, 298 omitAssertions, 299 insertFullInfopoints, 300 trackNodeSourcePosition, 301 Collections.unmodifiableList(Arrays.asList(newSkippedExceptionTypes)), 302 plugins); 303 } 304 305 public GraphBuilderConfiguration withBytecodeExceptionMode(BytecodeExceptionMode newBytecodeExceptionMode) { 306 return new GraphBuilderConfiguration(eagerResolving, 307 unresolvedIsError, 308 newBytecodeExceptionMode, 309 omitAssertions, 310 insertFullInfopoints, 311 trackNodeSourcePosition, 312 skippedExceptionTypes, 313 plugins); 314 } 315 316 public GraphBuilderConfiguration withOmitAssertions(boolean newOmitAssertions) { 317 return new GraphBuilderConfiguration( 318 eagerResolving, 319 unresolvedIsError, 320 bytecodeExceptionMode, 321 newOmitAssertions, 322 insertFullInfopoints, 323 trackNodeSourcePosition, 324 skippedExceptionTypes, 325 plugins); 326 } 327 328 public GraphBuilderConfiguration withFullInfopoints(boolean newInsertFullInfopoints) { 329 return new GraphBuilderConfiguration( 330 eagerResolving, 331 unresolvedIsError, 332 bytecodeExceptionMode, 333 omitAssertions, 334 newInsertFullInfopoints, 335 trackNodeSourcePosition, 336 skippedExceptionTypes, 337 plugins); 338 } 339 340 public GraphBuilderConfiguration withNodeSourcePosition(boolean newTrackNodeSourcePosition) { 341 return new GraphBuilderConfiguration( 342 eagerResolving, 343 unresolvedIsError, 344 bytecodeExceptionMode, 345 omitAssertions, 346 insertFullInfopoints, 347 newTrackNodeSourcePosition, 348 skippedExceptionTypes, 349 plugins); 350 } 351 352 public List<ResolvedJavaType> getSkippedExceptionTypes() { 353 return skippedExceptionTypes; 354 } 355 356 public boolean eagerResolving() { 357 return eagerResolving; 358 } 359 360 public BytecodeExceptionMode getBytecodeExceptionMode() { 361 return bytecodeExceptionMode; 362 } 363 364 public boolean omitAssertions() { 365 return omitAssertions; 366 } 367 368 public boolean trackNodeSourcePosition() { 369 return trackNodeSourcePosition; 370 } 371 372 public boolean insertFullInfopoints() { 373 return insertFullInfopoints; 374 } 375 376 public static GraphBuilderConfiguration getDefault(Plugins plugins) { 377 return new GraphBuilderConfiguration( 378 /* eagerResolving: */ false, 379 /* unresolvedIsError: */ false, 380 BytecodeExceptionMode.Profile, 381 /* omitAssertions: */ false, 382 /* insertFullInfopoints: */ false, 383 /* trackNodeSourcePosition: */ false, 384 Collections.emptyList(), 385 plugins); 386 } 387 388 public static GraphBuilderConfiguration getSnippetDefault(Plugins plugins) { 389 return new GraphBuilderConfiguration( 390 /* eagerResolving: */ true, 391 /* unresolvedIsError: */ true, 392 BytecodeExceptionMode.OmitAll, 393 /* omitAssertions: */ false, 394 /* insertFullInfopoints: */ false, 395 /* trackNodeSourcePosition: */ false, 396 Collections.emptyList(), 397 plugins); 398 } 399 400 /** Returns {@code true} if it is an error for a class/field/method resolution to fail. */ 401 public boolean unresolvedIsError() { 402 return unresolvedIsError; 403 } 404 405 public Plugins getPlugins() { 406 return plugins; 407 } 408 } |