@Override public boolean hasSideEffects(XExpression expr) { if (expr instanceof RichString) { return false; } return super.hasSideEffects(expr); } }
/** * @return whether the expression itself (not its children) possibly causes a side-effect */ public boolean hasSideEffects(XExpression expr) { if (expr instanceof XClosure || expr instanceof XStringLiteral || expr instanceof XTypeLiteral || expr instanceof XBooleanLiteral || expr instanceof XNumberLiteral || expr instanceof XNullLiteral || expr instanceof XAnnotation ) return false; if(expr instanceof XCollectionLiteral) { for(XExpression element: ((XCollectionLiteral)expr).getElements()) { if(hasSideEffects(element)) return true; } return false; } if (expr instanceof XAbstractFeatureCall) { XAbstractFeatureCall featureCall = (XAbstractFeatureCall) expr; return hasSideEffects(featureCall, true); } if (expr instanceof XConstructorCall) { XConstructorCall constrCall = (XConstructorCall) expr; return findPureAnnotation(constrCall.getConstructor()) == null; } return true; }
@Check public void checkInnerExpressions(XExpression expr) { if (!expressionHelper.hasSideEffects(expr) && !isValueExpectedRecursive(expr)) { mustBeJavaStatementExpression(expr); } }
protected boolean isVariableDeclarationRequired(XAbstractFeatureCall featureCall, XExpression expression, ITreeAppendable b) { if (featureCall == null) return false; XExpression actualReceiver = normalizeBlockExpression(getActualReceiver(featureCall)); List<XExpression> arguments = getActualArguments(featureCall); XExpression argument = normalizeBlockExpression(expression); int argumentIndex = -1; if (actualReceiver != argument) { argumentIndex = arguments.indexOf(argument); if (argumentIndex == -1) return false; } if (!expressionHelper.hasSideEffects(argument)) return false; int startIndex = argumentIndex + 1; int endIndex = arguments.size(); for (int i = startIndex; i < endIndex; i++) { if (isVariableDeclarationRequired(arguments.get(i), b, false)) return true; } return false; }
if(inspectContents) { for (XExpression param : featureCall.getActualArguments()) { if (hasSideEffects(param)) return true;
final XMemberFeatureCall sequence = getRootOfMemberFeatureCallSequence(readOnlyKeyword, null, it -> { if (getExpressionHelper().hasSideEffects(it)) { addIssue(MessageFormat.format(Messages.SARLValidator_11, keywordName), it, final JvmOperation operation = (JvmOperation) call.getFeature(); parameters = getParamTypeReferences(operation, false, true); hasSideEffects = getExpressionHelper().hasSideEffects(call); isVariadic = operation.isVarArgs(); } else {
if (!expressionHelper.hasSideEffects(expr, false)) { b.append("/* "); b.append(";"); } finally { if (!expressionHelper.hasSideEffects(expr, false)) { b.append(" */");
private void compileNullSafeFeatureCall(final XMemberFeatureCall expr, ITreeAppendable b, final boolean isReferenced) { XExpression memberCallTarget = normalizeBlockExpression(expr.getMemberCallTarget()); if (!isReferenced) { if (!expressionHelper.hasSideEffects(expr, false)) { b.append("/* "); } finally { b.decreaseIndentation().newLine().append("}"); if (!expressionHelper.hasSideEffects(expr, false)) { b.append(" */");
&& !this.services.getExpressionHelper().hasSideEffects(source.getExpression())) { addAnnotationSafe(bodyOperation, Pure.class);