/* * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package java.lang.classfile.attribute; import java.lang.classfile.CodeBuilder; import java.lang.classfile.instruction.CharacterRange; import jdk.internal.classfile.impl.UnboundAttribute; /** * Models a single character range entry in the {@link * CharacterRangeTableAttribute}. *
* Each character range entry associates a range of indices in the code array * with a range of character positions in the source file. A character position * in the source file is represented by a line number and a column number, and * its value is encoded as {@code lineNumber << 10 + columnNumber}. Note that * column numbers are not the same as byte indices in a column as multibyte * characters may be present in the source file. * * Each character range entry includes a * flag which indicates what kind of range is described: statement, assignment, * method call, etc. * * @see CharacterRangeTableAttribute#characterRangeTable() * @see CharacterRange * @since 24 */ public sealed interface CharacterRangeInfo permits UnboundAttribute.UnboundCharacterRangeInfo { /** * {@return the start of indices in the code array, inclusive} * * @see CharacterRange#startScope() */ int startPc(); /** * {@return the end of indices in the code array, exclusive} * * @see CharacterRange#endScope() */ int endPc(); /** * {@return the encoded start of character positions in the source file, * inclusive} */ int characterRangeStart(); /** * {@return the encoded end of character positions in the source file, * exclusive} */ int characterRangeEnd(); /** * {@return the flags of this character range entry} *
* The value of the flags item describes the kind of range. Multiple flags * may be set within flags. *
* if ( Flowcon ) Statement [else Statement]
* for ( ForInitOpt ; [Flowcon] ; ForUpdateOpt ) Statement
* while ( Flowcon ) Statement
* do Statement while ( Flowcon ) ;
* switch ( Flowcon ) { SwitchBlockStatementGroups }
* Flowcon || Expression3
* Flowcon && Expression3
* Flowcon ? Expression : Expression1
*
*
* if ( Flowcon ) Flowtarg [else Flowtarg]
* for ( ForInitOpt ; [Flowcon] ; ForUpdateOpt ) Flowtarg
* while ( Flowcon ) Flowtarg
* do Flowtarg while ( Flowcon ) ;
* Flowcon || Flowtarg
* Flowcon && Flowtarg
* Flowcon ? Flowtarg : Flowtarg
*
* * All bits of the flags item not assigned above are reserved for future use. * They should be set to zero in generated class files and should be ignored * by Java virtual machine implementations. * * @see CharacterRange#flags() */ int flags(); /** * {@return a character range entry} * * @apiNote * The created entry cannot be written to a {@link CodeBuilder}. Use * {@link CodeBuilder#characterRange CodeBuilder::characterRange} instead. * * @param startPc the start of indices in the code array, inclusive * @param endPc the end of indices in the code array, exclusive * @param characterRangeStart the encoded start of character positions in * the source file, inclusive * @param characterRangeEnd the encoded end of character positions in the * source file, exclusive * @param flags the flags of this entry */ static CharacterRangeInfo of(int startPc, int endPc, int characterRangeStart, int characterRangeEnd, int flags) { return new UnboundAttribute.UnboundCharacterRangeInfo(startPc, endPc, characterRangeStart, characterRangeEnd, flags); } }