View | Details | Raw Unified | Return to bug 109333 | Differences between
and this patch

Collapse All | Expand All

(-)dom/org/eclipse/jdt/core/dom/ASTConverter.java (-6 / +131 lines)
Lines 597-604 Link Here
597
597
598
	public Expression convert(org.eclipse.jdt.internal.compiler.ast.AND_AND_Expression expression) {
598
	public Expression convert(org.eclipse.jdt.internal.compiler.ast.AND_AND_Expression expression) {
599
		InfixExpression infixExpression = new InfixExpression(this.ast);
599
		InfixExpression infixExpression = new InfixExpression(this.ast);
600
		infixExpression.setOperator(InfixExpression.Operator.CONDITIONAL_AND);
600
		if (this.resolveBindings) {
601
		if (this.resolveBindings) {
601
			recordNodes(infixExpression, expression);
602
			this.recordNodes(infixExpression, expression);
603
		}
604
		final int expressionOperatorID = (expression.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.OperatorMASK) >> org.eclipse.jdt.internal.compiler.ast.ASTNode.OperatorSHIFT;
605
		if (expression.left instanceof org.eclipse.jdt.internal.compiler.ast.BinaryExpression
606
				&& ((expression.left.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.ParenthesizedMASK) == 0)) {
607
			// create an extended string literal equivalent => use the extended operands list
608
			infixExpression.extendedOperands().add(convert(expression.right));
609
			org.eclipse.jdt.internal.compiler.ast.Expression leftOperand = expression.left;
610
			org.eclipse.jdt.internal.compiler.ast.Expression rightOperand = null;
611
			do {
612
				rightOperand = ((org.eclipse.jdt.internal.compiler.ast.BinaryExpression) leftOperand).right;
613
				if ((((leftOperand.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.OperatorMASK) >> org.eclipse.jdt.internal.compiler.ast.ASTNode.OperatorSHIFT) != expressionOperatorID
614
							&& ((leftOperand.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.ParenthesizedMASK) == 0))
615
					 || ((rightOperand instanceof org.eclipse.jdt.internal.compiler.ast.BinaryExpression
616
				 			&& ((rightOperand.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.OperatorMASK) >> org.eclipse.jdt.internal.compiler.ast.ASTNode.OperatorSHIFT) != expressionOperatorID)
617
							&& ((rightOperand.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.ParenthesizedMASK) == 0))) {
618
				 	List extendedOperands = infixExpression.extendedOperands();
619
				 	InfixExpression temp = new InfixExpression(this.ast);
620
					if (this.resolveBindings) {
621
						this.recordNodes(temp, expression);
622
					}
623
				 	temp.setOperator(getOperatorFor(expressionOperatorID));
624
				 	Expression leftSide = convert(leftOperand);
625
					temp.setLeftOperand(leftSide);
626
					temp.setSourceRange(leftSide.getStartPosition(), leftSide.getLength());
627
					int size = extendedOperands.size();
628
				 	for (int i = 0; i < size - 1; i++) {
629
				 		Expression expr = temp;
630
				 		temp = new InfixExpression(this.ast);
631
				 		
632
						if (this.resolveBindings) {
633
							this.recordNodes(temp, expression);
634
						}				 	
635
				 		temp.setLeftOperand(expr);
636
					 	temp.setOperator(getOperatorFor(expressionOperatorID));
637
						temp.setSourceRange(expr.getStartPosition(), expr.getLength());
638
				 	}
639
				 	infixExpression = temp;
640
				 	for (int i = 0; i < size; i++) {
641
				 		Expression extendedOperand = (Expression) extendedOperands.remove(size - 1 - i);
642
				 		temp.setRightOperand(extendedOperand);
643
				 		int startPosition = temp.getLeftOperand().getStartPosition();
644
				 		temp.setSourceRange(startPosition, extendedOperand.getStartPosition() + extendedOperand.getLength() - startPosition);
645
				 		if (temp.getLeftOperand().getNodeType() == ASTNode.INFIX_EXPRESSION) {
646
				 			temp = (InfixExpression) temp.getLeftOperand();
647
				 		}
648
				 	}
649
					int startPosition = infixExpression.getLeftOperand().getStartPosition();
650
					infixExpression.setSourceRange(startPosition, expression.sourceEnd - startPosition + 1);
651
					if (this.resolveBindings) {
652
						this.recordNodes(infixExpression, expression);
653
					}
654
					return infixExpression;
655
				}
656
				infixExpression.extendedOperands().add(0, convert(rightOperand));
657
				leftOperand = ((org.eclipse.jdt.internal.compiler.ast.BinaryExpression) leftOperand).left;
658
			} while (leftOperand instanceof org.eclipse.jdt.internal.compiler.ast.BinaryExpression && ((leftOperand.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.ParenthesizedMASK) == 0));
659
			Expression leftExpression = convert(leftOperand);
660
			infixExpression.setLeftOperand(leftExpression);
661
			infixExpression.setRightOperand((Expression)infixExpression.extendedOperands().remove(0));
662
			int startPosition = leftExpression.getStartPosition();
663
			infixExpression.setSourceRange(startPosition, expression.sourceEnd - startPosition + 1);
664
			return infixExpression;
602
		}
665
		}
603
		Expression leftExpression = convert(expression.left);
666
		Expression leftExpression = convert(expression.left);
604
		infixExpression.setLeftOperand(leftExpression);
667
		infixExpression.setLeftOperand(leftExpression);
Lines 607-613 Link Here
607
		int startPosition = leftExpression.getStartPosition();
670
		int startPosition = leftExpression.getStartPosition();
608
		infixExpression.setSourceRange(startPosition, expression.sourceEnd - startPosition + 1);
671
		infixExpression.setSourceRange(startPosition, expression.sourceEnd - startPosition + 1);
609
		return infixExpression;
672
		return infixExpression;
610
	
611
	}
673
	}
612
674
613
	public AnnotationTypeDeclaration convertToAnnotationDeclaration(org.eclipse.jdt.internal.compiler.ast.TypeDeclaration typeDeclaration) {
675
	public AnnotationTypeDeclaration convertToAnnotationDeclaration(org.eclipse.jdt.internal.compiler.ast.TypeDeclaration typeDeclaration) {
Lines 2019-2034 Link Here
2019
	}
2081
	}
2020
2082
2021
	public Expression convert(org.eclipse.jdt.internal.compiler.ast.OR_OR_Expression expression) {
2083
	public Expression convert(org.eclipse.jdt.internal.compiler.ast.OR_OR_Expression expression) {
2022
		final InfixExpression infixExpression = new InfixExpression(this.ast);
2084
		InfixExpression infixExpression = new InfixExpression(this.ast);
2085
		infixExpression.setOperator(InfixExpression.Operator.CONDITIONAL_OR);
2023
		if (this.resolveBindings) {
2086
		if (this.resolveBindings) {
2024
			recordNodes(infixExpression, expression);
2087
			this.recordNodes(infixExpression, expression);
2088
		}
2089
		final int expressionOperatorID = (expression.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.OperatorMASK) >> org.eclipse.jdt.internal.compiler.ast.ASTNode.OperatorSHIFT;
2090
		if (expression.left instanceof org.eclipse.jdt.internal.compiler.ast.BinaryExpression
2091
				&& ((expression.left.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.ParenthesizedMASK) == 0)) {
2092
			// create an extended string literal equivalent => use the extended operands list
2093
			infixExpression.extendedOperands().add(convert(expression.right));
2094
			org.eclipse.jdt.internal.compiler.ast.Expression leftOperand = expression.left;
2095
			org.eclipse.jdt.internal.compiler.ast.Expression rightOperand = null;
2096
			do {
2097
				rightOperand = ((org.eclipse.jdt.internal.compiler.ast.BinaryExpression) leftOperand).right;
2098
				if ((((leftOperand.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.OperatorMASK) >> org.eclipse.jdt.internal.compiler.ast.ASTNode.OperatorSHIFT) != expressionOperatorID
2099
							&& ((leftOperand.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.ParenthesizedMASK) == 0))
2100
					 || ((rightOperand instanceof org.eclipse.jdt.internal.compiler.ast.BinaryExpression
2101
				 			&& ((rightOperand.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.OperatorMASK) >> org.eclipse.jdt.internal.compiler.ast.ASTNode.OperatorSHIFT) != expressionOperatorID)
2102
							&& ((rightOperand.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.ParenthesizedMASK) == 0))) {
2103
				 	List extendedOperands = infixExpression.extendedOperands();
2104
				 	InfixExpression temp = new InfixExpression(this.ast);
2105
					if (this.resolveBindings) {
2106
						this.recordNodes(temp, expression);
2107
					}
2108
				 	temp.setOperator(getOperatorFor(expressionOperatorID));
2109
				 	Expression leftSide = convert(leftOperand);
2110
					temp.setLeftOperand(leftSide);
2111
					temp.setSourceRange(leftSide.getStartPosition(), leftSide.getLength());
2112
					int size = extendedOperands.size();
2113
				 	for (int i = 0; i < size - 1; i++) {
2114
				 		Expression expr = temp;
2115
				 		temp = new InfixExpression(this.ast);
2116
				 		
2117
						if (this.resolveBindings) {
2118
							this.recordNodes(temp, expression);
2119
						}				 	
2120
				 		temp.setLeftOperand(expr);
2121
					 	temp.setOperator(getOperatorFor(expressionOperatorID));
2122
						temp.setSourceRange(expr.getStartPosition(), expr.getLength());
2123
				 	}
2124
				 	infixExpression = temp;
2125
				 	for (int i = 0; i < size; i++) {
2126
				 		Expression extendedOperand = (Expression) extendedOperands.remove(size - 1 - i);
2127
				 		temp.setRightOperand(extendedOperand);
2128
				 		int startPosition = temp.getLeftOperand().getStartPosition();
2129
				 		temp.setSourceRange(startPosition, extendedOperand.getStartPosition() + extendedOperand.getLength() - startPosition);
2130
				 		if (temp.getLeftOperand().getNodeType() == ASTNode.INFIX_EXPRESSION) {
2131
				 			temp = (InfixExpression) temp.getLeftOperand();
2132
				 		}
2133
				 	}
2134
					int startPosition = infixExpression.getLeftOperand().getStartPosition();
2135
					infixExpression.setSourceRange(startPosition, expression.sourceEnd - startPosition + 1);
2136
					if (this.resolveBindings) {
2137
						this.recordNodes(infixExpression, expression);
2138
					}
2139
					return infixExpression;
2140
				}
2141
				infixExpression.extendedOperands().add(0, convert(rightOperand));
2142
				leftOperand = ((org.eclipse.jdt.internal.compiler.ast.BinaryExpression) leftOperand).left;
2143
			} while (leftOperand instanceof org.eclipse.jdt.internal.compiler.ast.BinaryExpression && ((leftOperand.bits & org.eclipse.jdt.internal.compiler.ast.ASTNode.ParenthesizedMASK) == 0));
2144
			Expression leftExpression = convert(leftOperand);
2145
			infixExpression.setLeftOperand(leftExpression);
2146
			infixExpression.setRightOperand((Expression)infixExpression.extendedOperands().remove(0));
2147
			int startPosition = leftExpression.getStartPosition();
2148
			infixExpression.setSourceRange(startPosition, expression.sourceEnd - startPosition + 1);
2149
			return infixExpression;
2025
		}
2150
		}
2026
		Expression leftExpression = convert(expression.left);
2151
		Expression leftExpression = convert(expression.left);
2027
		infixExpression.setLeftOperand(leftExpression);
2152
		infixExpression.setLeftOperand(leftExpression);
2028
		infixExpression.setRightOperand(convert(expression.right));
2153
		infixExpression.setRightOperand(convert(expression.right));
2029
		infixExpression.setOperator(InfixExpression.Operator.CONDITIONAL_OR);
2154
		infixExpression.setOperator(InfixExpression.Operator.CONDITIONAL_OR);
2030
		int sourceStart = leftExpression.getStartPosition();
2155
		int startPosition = leftExpression.getStartPosition();
2031
		infixExpression.setSourceRange(sourceStart, expression.sourceEnd - sourceStart + 1);
2156
		infixExpression.setSourceRange(startPosition, expression.sourceEnd - startPosition + 1);
2032
		return infixExpression;
2157
		return infixExpression;
2033
	}
2158
	}
2034
2159

Return to bug 109333