/** * Analyzes a live documentation expression which includes an 'or' operator. * Known limitations: 1) Only binary 'or' supported (or(a,b,c) not supported). * 2) no current way to express 'or' relationship between a primitive parameter * (e.g: fenceType()) and a complex parameter (e.g: host().address()). This is * because primitive parameters are not expressed using member-involvement-trees, * and the current method of expression 'or' is by using member-involvement-trees. */ private void analyzeOrExpression(MethodExpression expression, List<Parameter> parameters) { List<Expression> expressions = expression.getParameters(); assert (expressions.size()==2); //binary 'or'. assert (expressions.get(0) instanceof MethodExpression); //expected to start with: "mandatory|optional(...) assert (expressions.get(1) instanceof MethodExpression); //expected to start with: "mandatory|optional(...) boolean mandatory = isMandatory((MethodExpression)expressions.get(0)); //if one is mandatory, the other is also expected to be, and vice-versa. assert mandatory==isMandatory((MethodExpression)expressions.get(1)); MethodExpression expression1 = getMethodExpression(removePrefix((MethodExpression)expressions.get(0))); MethodExpression expression2 = getMethodExpression(removePrefix((MethodExpression)expressions.get(1))); MemberInvolvementTree tree1 = analyzeExpression(expression1, parameters, mandatory); MemberInvolvementTree tree2 = analyzeExpression(expression2, parameters, mandatory); //Make the two leaves which have an 'or' relationship between them 'point' to each other. tree1.setAlternative(tree2); assert (!tree2.hasChildren()); removeTree(tree2, parameters, expression2); }