Class JUtil
java.lang.Object
com.pnfsoftware.jeb.core.units.code.java.JUtil
Collection of utility methods to manipulate
IJavaElement
.-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic boolean
canThrow
(IJavaStatement stm) static IJavaLabel
Check that the statement is a simple "if(...) { goto x; }" and if so, returns "x"static IJavaElement
findParent
(IJavaElement root, IJavaElement elt) Retrieve the parent of an AST element (or first parent, if the element is reusable and has potentially multiple parents).static String
generate
(IJavaElement elt) static IJavaStatement
getFirstRealStatement
(IJavaBlock b, int i) This convenience method attempts to determine the next "real" statement to be executed in the block, starting at the provided index 'i'.static IJavaLabel
static List<IJavaStatement>
getGotos
(IJavaLabel targetLabel, List<IJavaStatement> flatlist) static IJavaIdentifier
static List<IJavaIdentifier>
static IJavaExpression
static IJavaExpression
static IJavaConstant
getNegatedConstant
(IJavaConstant cst, IJavaConstantFactory factory) Get the negated value of a constant, if possible.static String
static IJavaIdentifier
Detect: x, (int)xstatic boolean
static boolean
Determine whether the statement defines an identifier.static boolean
static boolean
isGotoTo
(IJavaStatement stm, IJavaLabel target) Check that the statement is a "goto target;"static boolean
isIdentOrDefinition
(IJavaElement e, IJavaIdentifier ident) Determine whether the elements is the provided identifier or a simple definition of the identifier.static boolean
isIf
(IJavaStatement stm) Determine whether a statement is a simple if: if(...){...}.static boolean
static boolean
isIfElse
(IJavaStatement stm) Determine whether a statement is like: if(...){...}else{...} which is the if-statement with 2 blocks: the main case block and the default block.static IJavaLabel
isIfGoto
(IJavaStatement stm) Determine if the provided statement is likeif(COND){goto LABEL;}
and if so, return the label.static boolean
isIfNoElse
(IJavaStatement stm) Determine whether a statement is like: if(...){ }[else if(...){}]*static boolean
Detect: 1, x, (int)xstatic boolean
isIntegerConstant
(IJavaElement e, int expected) static boolean
static boolean
isMonitorExit
(IJavaElement stm, IJavaExpression expectedLock) static boolean
Determine whether the provided statement is a return, throw, goto, break, or continue.static boolean
Recursively determine if the statement is or contains a Label.static boolean
static boolean
static boolean
static boolean
isThrow
(IJavaStatement stm, IJavaExpression expectedThrown) static IJavaExpression
isThrowLike
(IJavaStatement stm, List<IJavaStatement> flatlist) static IJavaCatchBlock
isTryCatchall
(IJavaBlock b, int i) Determine whether the provided statement is a try-catch-all (single catch block, that catches all exceptions)static IJavaCatchBlock
isTryCatchall
(IJavaTry trystm) static void
moveStatements
(IJavaBlock src, int srcbegin, int srcend, IJavaBlock dst, int dstindex) static int
removeStatementsDeep
(IJavaBlock b, Predicate<IJavaStatement> checker) static IJavaExpression
resolveLogicalNot
(IJavaExpression exp, IJavaGlobalContext jctx)
-
Constructor Details
-
JUtil
public JUtil()
-
-
Method Details
-
generate
-
findParent
Retrieve the parent of an AST element (or first parent, if the element is reusable and has potentially multiple parents).- Parameters:
root
- a root element, typically, anIJavaClass
elt
- the element for which the first parent is to be found- Returns:
- the parent or null
-
isClassMethodField
- Parameters:
e
-- Returns:
-
isIntegerConstant
- Parameters:
e
-- Returns:
-
isStringConstant
- Returns:
-
getStringConstant
- Parameters:
e
-- Returns:
-
checkIfGoto
Check that the statement is a simple "if(...) { goto x; }" and if so, returns "x"- Parameters:
stm
- statement to check- Returns:
- the label or null
-
isGotoTo
Check that the statement is a "goto target;"- Parameters:
stm
- the statementtarget
- the target- Returns:
-
isIf
Determine whether a statement is a simple if: if(...){...}.- Parameters:
stm
-- Returns:
-
isIfElse
Determine whether a statement is like: if(...){...}else{...} which is the if-statement with 2 blocks: the main case block and the default block.- Parameters:
stm
-- Returns:
-
isIfNoElse
Determine whether a statement is like: if(...){ }[else if(...){}]*ie, the if-block can have multiple case-blocks but NO default 'else' block
- Parameters:
stm
-- Returns:
-
isIfGoto
Determine if the provided statement is likeif(COND){goto LABEL;}
and if so, return the label. -
getFirstRealStatement
This convenience method attempts to determine the next "real" statement to be executed in the block, starting at the provided index 'i'.This method can only go "deeper" (forward). It cannot go "up", which would require keeping track of parents. Use a
PStmManager
to do that.Important: Label statements are not skipped over. This method skips over:
- the "do {" part of a do-while block
- the "while(true) {" part of a while block
- the "if(true) {" part of a conditional statement
- the "try {" part of a try-catch block
- Parameters:
b
- current blocki
- current statement index in the block- Returns:
- the statement, or null if none were found
-
isTryCatchall
Determine whether the provided statement is a try-catch-all (single catch block, that catches all exceptions)- Parameters:
b
- blocki
- statement index in the block- Returns:
- the catch-all block or null
-
isTryCatchall
- Parameters:
trystm
- aIJavaTry
statement- Returns:
- true if the try-statement is a try-catch-all (single catch block, that catches all exceptions)
-
getVarLike
Detect: x, (int)x- Parameters:
e
-- Returns:
- x or null
-
isImmOrVarLike
Detect: 1, x, (int)x- Parameters:
e
-- Returns:
- true or false
-
getIdentifiers
- Parameters:
e
-- Returns:
-
isIdentOrDefinition
Determine whether the elements is the provided identifier or a simple definition of the identifier.- Parameters:
e
-ident
-- Returns:
-
isDeclarationOrDefinition
Determine whether the statement defines an identifier.Currently, definitions should only be found in four types of statements:
- pure decl: "int x;"
- decl + init: "int x = 0;"
- in top-level Method elements (NOT CHECKED HERE)
- in compound Try elements (NOT CHECKED HERE)- Parameters:
stm
-- Returns:
-
isThrowLike
- Parameters:
stm
- a statement, that we want to be a THROW or a GOTO-THROWflatlist
-- Returns:
- on success, the THROWN expression; else, null
-
isThrow
-
getMonitorEnter
-
getMonitorExit
-
isMonitorExit
-
isMonitorExit
- Parameters:
stm
-expectedLock
- optional- Returns:
-
getGotos
-
getGotoLabel
-
getIdentifier
-
removeStatementsDeep
-
isOrContainsLabel
Recursively determine if the statement is or contains a Label. Can be called for any statement, including compound statements.- Parameters:
stm
-- Returns:
-
canThrow
-
getNegatedConstant
Get the negated value of a constant, if possible.- Parameters:
cst
- a constantfactory
- constant factory- Returns:
- null if the negative value cannot be represented (e.g., constant type no fitting) or is the same as the provided constant
-
isNonCompoundFlowBreaker
Determine whether the provided statement is a return, throw, goto, break, or continue.- Parameters:
stm
-- Returns:
-
moveStatements
public static void moveStatements(IJavaBlock src, int srcbegin, int srcend, IJavaBlock dst, int dstindex) - Parameters:
src
-srcbegin
-srcend
-dst
-dstindex
-
-
isSimpleBreak
-
isSimpleContinue
-
isFlowBreaker
-
isIfContinue
-
resolveLogicalNot
- Parameters:
exp
- a LOG_NOT operationjctx
-- Returns:
- if the LOG_NOT was simplified, a non-null reference to the simplified IR (may be the same ref as the input expression, since modifications are also attempted in place)
-