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

Collapse All | Expand All

(-)codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java (-115 / +124 lines)
Lines 6647-6780 Link Here
6647
		if (enclosingNode == null || !(enclosingNode instanceof IfStatement)) return;
6647
		if (enclosingNode == null || !(enclosingNode instanceof IfStatement)) return;
6648
6648
6649
		IfStatement ifStatement = (IfStatement)enclosingNode;
6649
		IfStatement ifStatement = (IfStatement)enclosingNode;
6650
6650
		while(true) {
6651
		if (!(ifStatement.condition instanceof InstanceOfExpression)) return;
6651
			if (!(ifStatement.condition instanceof InstanceOfExpression)) return;
6652
6652
	
6653
		InstanceOfExpression instanceOfExpression = (InstanceOfExpression) ifStatement.condition;
6653
			InstanceOfExpression instanceOfExpression = (InstanceOfExpression) ifStatement.condition;
6654
6654
	
6655
		TypeReference instanceOfType = instanceOfExpression.type;
6655
			TypeReference instanceOfType = instanceOfExpression.type;
6656
6656
	
6657
		if (instanceOfType.resolvedType == null) return;
6657
			if (instanceOfType.resolvedType == null) return;
6658
6658
	
6659
		boolean findFromAnotherReceiver = false;
6659
			boolean findFromAnotherReceiver = false;
6660
6660
	
6661
		char[][] receiverName = null;
6661
			char[][] receiverName = null;
6662
		int receiverStart = -1;
6662
			int receiverStart = -1;
6663
		int receiverEnd = -1;
6663
			int receiverEnd = -1;
6664
6664
	
6665
		if (receiver instanceof QualifiedNameReference) {
6665
			if (receiver instanceof QualifiedNameReference) {
6666
			QualifiedNameReference qualifiedNameReference = (QualifiedNameReference) receiver;
6666
				QualifiedNameReference qualifiedNameReference = (QualifiedNameReference) receiver;
6667
6667
	
6668
			receiverName = qualifiedNameReference.tokens;
6668
				receiverName = qualifiedNameReference.tokens;
6669
6669
	
6670
			if (receiverName.length != 1) return;
6670
				if (receiverName.length != 1) return;
6671
6671
	
6672
			receiverStart = (int) (qualifiedNameReference.sourcePositions[0] >>> 32);
6672
				receiverStart = (int) (qualifiedNameReference.sourcePositions[0] >>> 32);
6673
			receiverEnd = (int) qualifiedNameReference.sourcePositions[qualifiedNameReference.tokens.length - 1] + 1;
6673
				receiverEnd = (int) qualifiedNameReference.sourcePositions[qualifiedNameReference.tokens.length - 1] + 1;
6674
6674
	
6675
			// if (local instanceof X) local.|
6675
				// if (local instanceof X) local.|
6676
			// if (field instanceof X) field.|
6676
				// if (field instanceof X) field.|
6677
			if (instanceOfExpression.expression instanceof SingleNameReference &&
6678
					((SingleNameReference)instanceOfExpression.expression).binding == qualifiedBinding &&
6679
					(qualifiedBinding instanceof LocalVariableBinding || qualifiedBinding instanceof FieldBinding)) {
6680
				findFromAnotherReceiver = true;
6681
			}
6682
6683
			// if (this.field instanceof X) field.|
6684
			if (instanceOfExpression.expression instanceof FieldReference) {
6685
				FieldReference fieldReference = (FieldReference)instanceOfExpression.expression;
6686
6687
				if (fieldReference.receiver instanceof ThisReference &&
6688
						qualifiedBinding instanceof FieldBinding &&
6689
						fieldReference.binding == qualifiedBinding) {
6690
							findFromAnotherReceiver = true;
6691
				}
6692
			}
6693
		} else if (receiver instanceof FieldReference) {
6694
			FieldReference fieldReference1 = (FieldReference) receiver;
6695
6696
			receiverStart = fieldReference1.sourceStart;
6697
			receiverEnd = fieldReference1.sourceEnd + 1;
6698
6699
			if (fieldReference1.receiver instanceof ThisReference) {
6700
6701
				receiverName = new char[][] {THIS, fieldReference1.token};
6702
6703
				// if (field instanceof X) this.field.|
6704
				if (instanceOfExpression.expression instanceof SingleNameReference &&
6677
				if (instanceOfExpression.expression instanceof SingleNameReference &&
6705
						((SingleNameReference)instanceOfExpression.expression).binding == fieldReference1.binding) {
6678
						((SingleNameReference)instanceOfExpression.expression).binding == qualifiedBinding &&
6679
						(qualifiedBinding instanceof LocalVariableBinding || qualifiedBinding instanceof FieldBinding)) {
6706
					findFromAnotherReceiver = true;
6680
					findFromAnotherReceiver = true;
6707
				}
6681
				}
6708
6682
	
6709
				// if (this.field instanceof X) this.field.|
6683
				// if (this.field instanceof X) field.|
6710
				if (instanceOfExpression.expression instanceof FieldReference) {
6684
				if (instanceOfExpression.expression instanceof FieldReference) {
6711
					FieldReference fieldReference2 = (FieldReference)instanceOfExpression.expression;
6685
					FieldReference fieldReference = (FieldReference)instanceOfExpression.expression;
6712
6686
	
6713
					if (fieldReference2.receiver instanceof ThisReference &&
6687
					if (fieldReference.receiver instanceof ThisReference &&
6714
							fieldReference2.binding == fieldReference1.binding) {
6688
							qualifiedBinding instanceof FieldBinding &&
6689
							fieldReference.binding == qualifiedBinding) {
6715
								findFromAnotherReceiver = true;
6690
								findFromAnotherReceiver = true;
6716
					}
6691
					}
6717
				}
6692
				}
6693
			} else if (receiver instanceof FieldReference) {
6694
				FieldReference fieldReference1 = (FieldReference) receiver;
6695
	
6696
				receiverStart = fieldReference1.sourceStart;
6697
				receiverEnd = fieldReference1.sourceEnd + 1;
6698
	
6699
				if (fieldReference1.receiver instanceof ThisReference) {
6700
	
6701
					receiverName = new char[][] {THIS, fieldReference1.token};
6702
	
6703
					// if (field instanceof X) this.field.|
6704
					if (instanceOfExpression.expression instanceof SingleNameReference &&
6705
							((SingleNameReference)instanceOfExpression.expression).binding == fieldReference1.binding) {
6706
						findFromAnotherReceiver = true;
6707
					}
6708
	
6709
					// if (this.field instanceof X) this.field.|
6710
					if (instanceOfExpression.expression instanceof FieldReference) {
6711
						FieldReference fieldReference2 = (FieldReference)instanceOfExpression.expression;
6712
	
6713
						if (fieldReference2.receiver instanceof ThisReference &&
6714
								fieldReference2.binding == fieldReference1.binding) {
6715
									findFromAnotherReceiver = true;
6716
						}
6717
					}
6718
				}
6718
			}
6719
			}
6719
		}
6720
	
6720
6721
			if (findFromAnotherReceiver) {
6721
		if (findFromAnotherReceiver) {
6722
				TypeBinding receiverTypeBinding = instanceOfType.resolvedType;
6722
			TypeBinding receiverTypeBinding = instanceOfType.resolvedType;
6723
				char[] castedReceiver = null;
6723
			char[] castedReceiver = null;
6724
	
6724
6725
				char[] castedTypeChars = CharOperation.concatWith(instanceOfType.getTypeName(), '.');
6725
			char[] castedTypeChars = CharOperation.concatWith(instanceOfType.getTypeName(), '.');
6726
				if(this.source != null) {
6726
			if(this.source != null) {
6727
					int memberRefStart = this.startPosition;
6727
				int memberRefStart = this.startPosition;
6728
	
6728
6729
					char[] receiverChars = CharOperation.subarray(this.source, receiverStart, receiverEnd);
6729
				char[] receiverChars = CharOperation.subarray(this.source, receiverStart, receiverEnd);
6730
					char[] dotChars = CharOperation.subarray(this.source, receiverEnd, memberRefStart);
6730
				char[] dotChars = CharOperation.subarray(this.source, receiverEnd, memberRefStart);
6731
	
6731
6732
					castedReceiver =
6732
				castedReceiver =
6733
					CharOperation.concat(
6734
						CharOperation.concat(
6733
						CharOperation.concat(
6735
							'(',
6736
							CharOperation.concat(
6734
							CharOperation.concat(
6737
								CharOperation.concat('(', castedTypeChars, ')'),
6735
								'(',
6738
								receiverChars),
6736
								CharOperation.concat(
6739
							')'),
6737
									CharOperation.concat('(', castedTypeChars, ')'),
6740
						dotChars);
6738
									receiverChars),
6741
			} else {
6739
								')'),
6742
				castedReceiver =
6740
							dotChars);
6743
					CharOperation.concat(
6741
				} else {
6742
					castedReceiver =
6744
						CharOperation.concat(
6743
						CharOperation.concat(
6745
							'(',
6746
							CharOperation.concat(
6744
							CharOperation.concat(
6747
								CharOperation.concat('(', castedTypeChars, ')'),
6745
								'(',
6748
								CharOperation.concatWith(receiverName, '.')),
6746
								CharOperation.concat(
6749
							')'),
6747
									CharOperation.concat('(', castedTypeChars, ')'),
6750
						DOT);
6748
									CharOperation.concatWith(receiverName, '.')),
6749
								')'),
6750
							DOT);
6751
				}
6752
	
6753
				if (castedReceiver == null) return;
6754
	
6755
				int oldStartPosition = this.startPosition;
6756
				this.startPosition = receiverStart;
6757
	
6758
				findFieldsAndMethods(
6759
						this.completionToken,
6760
						receiverTypeBinding,
6761
						scope,
6762
						fieldsFound,
6763
						methodsFound,
6764
						invocationSite,
6765
						invocationScope,
6766
						false,
6767
						false,
6768
						null,
6769
						null,
6770
						null,
6771
						false,
6772
						castedReceiver,
6773
						receiverStart,
6774
						receiverEnd);
6775
	
6776
				this.startPosition = oldStartPosition;
6751
			}
6777
			}
6752
6778
			// traverse the enclosing node to find the instanceof expression corresponding
6753
			if (castedReceiver == null) return;
6779
			// to the completion node (if any)
6754
6780
			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
6755
			int oldStartPosition = this.startPosition;
6781
			if(ifStatement.thenStatement instanceof IfStatement) {
6756
			this.startPosition = receiverStart;
6782
				ifStatement = (IfStatement) ifStatement.thenStatement;
6757
6783
			} else {
6758
			findFieldsAndMethods(
6784
				break;
6759
					this.completionToken,
6785
			}
6760
					receiverTypeBinding,
6786
		}		
6761
					scope,
6762
					fieldsFound,
6763
					methodsFound,
6764
					invocationSite,
6765
					invocationScope,
6766
					false,
6767
					false,
6768
					null,
6769
					null,
6770
					null,
6771
					false,
6772
					castedReceiver,
6773
					receiverStart,
6774
					receiverEnd);
6775
6776
			this.startPosition = oldStartPosition;
6777
		}
6778
	}
6787
	}
6779
	private void findFieldsAndMethodsFromFavorites(
6788
	private void findFieldsAndMethodsFromFavorites(
6780
			char[] token,
6789
			char[] token,
(-)codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java (-34 / +74 lines)
Lines 564-575 Link Here
564
			if(expression == this.assistNode
564
			if(expression == this.assistNode
565
				|| (expression instanceof Assignment	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=287939
565
				|| (expression instanceof Assignment	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=287939
566
					&& ((Assignment)expression).expression == this.assistNode
566
					&& ((Assignment)expression).expression == this.assistNode
567
					&& (this.expressionPtr > 0 && this.expressionStack[this.expressionPtr - 1] instanceof InstanceOfExpression))
567
					&& (this.expressionPtr > 0 && expressionStackHasInstanceOfExpression(this.expressionPtr-1)))
568
				|| (expression instanceof BinaryExpression	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
569
					&& (((BinaryExpression)expression).left == this.assistNode || ((BinaryExpression)expression).right == this.assistNode)
570
					&& (this.expressionPtr > 0 && expressionStackHasInstanceOfExpression(this.expressionPtr-1)))
568
				|| (expression instanceof AllocationExpression
571
				|| (expression instanceof AllocationExpression
569
					&& ((AllocationExpression)expression).type == this.assistNode)){
572
					&& ((AllocationExpression)expression).type == this.assistNode)){
570
				buildMoreCompletionContext(expression);
573
				buildMoreCompletionContext(expression);
571
				if (this.assistNodeParent == null
574
				if (this.assistNodeParent == null
572
					&& expression instanceof Assignment) {
575
					&& (expression instanceof Assignment || expression instanceof BinaryExpression)) {
573
					this.assistNodeParent = detector.getCompletionNodeParent();
576
					this.assistNodeParent = detector.getCompletionNodeParent();
574
				}
577
				}
575
				return;
578
				return;
Lines 1066-1106 Link Here
1066
	int blockIndex = lastIndexOfElement(K_BLOCK_DELIMITER);
1069
	int blockIndex = lastIndexOfElement(K_BLOCK_DELIMITER);
1067
	int controlIndex = lastIndexOfElement(K_CONTROL_STATEMENT_DELIMITER);
1070
	int controlIndex = lastIndexOfElement(K_CONTROL_STATEMENT_DELIMITER);
1068
	int index = blockIndex != -1 && controlIndex < blockIndex ? blockIndex : controlIndex;
1071
	int index = blockIndex != -1 && controlIndex < blockIndex ? blockIndex : controlIndex;
1069
1072
	IfStatement ifStatement = null;
1070
	if (index != -1 && this.elementInfoStack[index] == IF && this.elementObjectInfoStack[index] != null) {
1073
	while (index >= 0) {
1071
		Expression condition = (Expression)this.elementObjectInfoStack[index];
1074
	// Try to find an enclosing if statement even if one is not found immediately preceding the completion node.
1072
1075
		if (index != -1 && this.elementInfoStack[index] == IF && this.elementObjectInfoStack[index] != null) {
1073
		// If currentElement is a RecoveredLocalVariable then it can be contained in the if statement
1076
			Expression condition = (Expression)this.elementObjectInfoStack[index];
1074
		if (this.currentElement instanceof RecoveredLocalVariable &&
1077
	
1075
				this.currentElement.parent instanceof RecoveredBlock) {
1078
			// If currentElement is a RecoveredLocalVariable then it can be contained in the if statement
1076
			RecoveredLocalVariable recoveredLocalVariable = (RecoveredLocalVariable) this.currentElement;
1079
			if (this.currentElement instanceof RecoveredLocalVariable &&
1077
			if (recoveredLocalVariable.localDeclaration.initialization == null &&
1080
					this.currentElement.parent instanceof RecoveredBlock) {
1078
					statement instanceof Expression &&
1081
				RecoveredLocalVariable recoveredLocalVariable = (RecoveredLocalVariable) this.currentElement;
1079
					condition.sourceStart < recoveredLocalVariable.localDeclaration.sourceStart) {
1082
				if (recoveredLocalVariable.localDeclaration.initialization == null &&
1080
				this.currentElement.add(statement, 0);
1083
						statement instanceof Expression &&
1081
1084
						condition.sourceStart < recoveredLocalVariable.localDeclaration.sourceStart) {
1082
				statement = recoveredLocalVariable.updatedStatement(0, new HashSet());
1085
					this.currentElement.add(statement, 0);
1083
1086
	
1084
				// RecoveredLocalVariable must be removed from its parent because the IfStatement will be added instead
1087
					statement = recoveredLocalVariable.updatedStatement(0, new HashSet());
1085
				RecoveredBlock recoveredBlock =  (RecoveredBlock) recoveredLocalVariable.parent;
1088
	
1086
				recoveredBlock.statements[--recoveredBlock.statementCount] = null;
1089
					// RecoveredLocalVariable must be removed from its parent because the IfStatement will be added instead
1087
1090
					RecoveredBlock recoveredBlock =  (RecoveredBlock) recoveredLocalVariable.parent;
1088
				this.currentElement = recoveredBlock;
1091
					recoveredBlock.statements[--recoveredBlock.statementCount] = null;
1089
1092
	
1093
					this.currentElement = recoveredBlock;
1094
	
1095
				}
1090
			}
1096
			}
1097
	
1098
			ifStatement =
1099
				new IfStatement(
1100
						condition,
1101
						statement,
1102
						condition.sourceStart,
1103
						statement.sourceEnd);
1104
			index--;
1105
			break;
1091
		}
1106
		}
1092
1107
		index--;
1093
		IfStatement ifStatement =
1094
			new IfStatement(
1095
					condition,
1096
					statement,
1097
					condition.sourceStart,
1098
					statement.sourceEnd);
1099
		this.enclosingNode = ifStatement;
1100
		return ifStatement;
1101
	}
1108
	}
1102
1109
	if (ifStatement == null) {
1103
	return statement;
1110
		return statement;
1111
	}
1112
	// collect all if statements with instanceof expressions that enclose the completion node
1113
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
1114
	while(index >= 0) {
1115
		if (this.elementInfoStack[index] == IF && this.elementObjectInfoStack[index] instanceof InstanceOfExpression) {
1116
			InstanceOfExpression condition = (InstanceOfExpression)this.elementObjectInfoStack[index];
1117
			ifStatement =
1118
				new IfStatement(
1119
						condition,
1120
						ifStatement,
1121
						condition.sourceStart,
1122
						statement.sourceEnd);
1123
		}
1124
		index--;
1125
	}
1126
	this.enclosingNode = ifStatement;
1127
	return ifStatement;
1104
}
1128
}
1105
private void buildMoreGenericsCompletionContext(ASTNode node, boolean consumeTypeArguments) {
1129
private void buildMoreGenericsCompletionContext(ASTNode node, boolean consumeTypeArguments) {
1106
	int kind = topKnownElementKind(COMPLETION_OR_ASSIST_PARSER);
1130
	int kind = topKnownElementKind(COMPLETION_OR_ASSIST_PARSER);
Lines 4793-4796 Link Here
4793
		return field;
4817
		return field;
4794
	}
4818
	}
4795
}
4819
}
4820
4821
/*
4822
 * To find out if the expressionStack has an instanceof expression
4823
 * at the given startIndex or at one prior to that
4824
 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
4825
 */
4826
private boolean expressionStackHasInstanceOfExpression(int startIndex) {
4827
	int indexInstanceOf = startIndex;
4828
	while (indexInstanceOf >= 0) {
4829
		if (this.expressionStack[indexInstanceOf] instanceof InstanceOfExpression) {
4830
			return true;
4831
		}
4832
		indexInstanceOf--;
4833
	}
4834
	return false;
4835
}
4796
}
4836
}
(-)src/org/eclipse/jdt/core/tests/model/CompletionTests.java (-8 / +452 lines)
Lines 2369-2375 Link Here
2369
			requestor.getResults());
2369
			requestor.getResults());
2370
}
2370
}
2371
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193909
2371
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193909
2372
// unsupported case
2372
// originally unsupported case - fixed with https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
2373
public void testCompletionAfterInstanceof03_05() throws JavaModelException {
2373
public void testCompletionAfterInstanceof03_05() throws JavaModelException {
2374
	this.workingCopies = new ICompilationUnit[1];
2374
	this.workingCopies = new ICompilationUnit[1];
2375
	this.workingCopies[0] = getWorkingCopy(
2375
	this.workingCopies[0] = getWorkingCopy(
Lines 2394-2401 Link Here
2394
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
2394
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
2395
	int start1 = str.lastIndexOf("equal") + "".length();
2395
	int start1 = str.lastIndexOf("equal") + "".length();
2396
	int end1 = start1 + "equal".length();
2396
	int end1 = start1 + "equal".length();
2397
	int start2 = str.lastIndexOf("a.equal");
2398
	int end2 = start2 + "a.equal".length();
2399
	int start3 = str.lastIndexOf("a.");
2400
	int end3 = start3 + "a".length();
2397
	assertResults(
2401
	assertResults(
2398
			"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), replace["+start1+", "+end1+"], token["+start1+", "+end1+"], " + (relevance1) + "}",
2402
			"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), replace["+start1+", "+end1+"], token["+start1+", "+end1+"], " + (relevance1) + "}\n" +
2403
			"equalsFoo[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).equalsFoo(), Ltest.CompletionAfterInstanceOf;, ()V, Ltest.CompletionAfterInstanceOf;, equalsFoo, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
2399
			requestor.getResults());
2404
			requestor.getResults());
2400
}
2405
}
2401
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193909
2406
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193909
Lines 2504-2510 Link Here
2504
			requestor.getResults());
2509
			requestor.getResults());
2505
}
2510
}
2506
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193909
2511
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193909
2507
// unsupported case
2512
// originally unsupported case - fixed with https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
2508
public void testCompletionAfterInstanceof06_01() throws JavaModelException {
2513
public void testCompletionAfterInstanceof06_01() throws JavaModelException {
2509
	this.workingCopies = new ICompilationUnit[1];
2514
	this.workingCopies = new ICompilationUnit[1];
2510
	this.workingCopies[0] = getWorkingCopy(
2515
	this.workingCopies[0] = getWorkingCopy(
Lines 2529-2540 Link Here
2529
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
2534
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
2530
	int start1 = str.lastIndexOf("equal") + "".length();
2535
	int start1 = str.lastIndexOf("equal") + "".length();
2531
	int end1 = start1 + "equal".length();
2536
	int end1 = start1 + "equal".length();
2537
	int start2 = str.lastIndexOf("a.equal");
2538
	int end2 = start2 + "a.equal".length();
2539
	int start3 = str.lastIndexOf("a.");
2540
	int end3 = start3 + "a".length();
2532
	assertResults(
2541
	assertResults(
2533
			"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), replace["+start1+", "+end1+"], token["+start1+", "+end1+"], " + (relevance1) + "}",
2542
			"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), replace["+start1+", "+end1+"], token["+start1+", "+end1+"], " + (relevance1) + "}\n" +
2543
			"equalsFoo[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).equalsFoo(), Ltest.CompletionAfterInstanceOf;, ()V, Ltest.CompletionAfterInstanceOf;, equalsFoo, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
2534
			requestor.getResults());
2544
			requestor.getResults());
2535
}
2545
}
2536
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193909
2546
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193909
2537
// unsupported case
2547
// originally unsupported case - fixed with https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
2538
public void testCompletionAfterInstanceof06_02() throws JavaModelException {
2548
public void testCompletionAfterInstanceof06_02() throws JavaModelException {
2539
	this.workingCopies = new ICompilationUnit[1];
2549
	this.workingCopies = new ICompilationUnit[1];
2540
	this.workingCopies[0] = getWorkingCopy(
2550
	this.workingCopies[0] = getWorkingCopy(
Lines 2559-2570 Link Here
2559
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
2569
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
2560
	int start1 = str.lastIndexOf("equal") + "".length();
2570
	int start1 = str.lastIndexOf("equal") + "".length();
2561
	int end1 = start1 + "equal".length();
2571
	int end1 = start1 + "equal".length();
2572
	int start2 = str.lastIndexOf("a.equal");
2573
	int end2 = start2 + "a.equal".length();
2574
	int start3 = str.lastIndexOf("a.");
2575
	int end3 = start3 + "a".length();
2562
	assertResults(
2576
	assertResults(
2563
			"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), replace["+start1+", "+end1+"], token["+start1+", "+end1+"], " + (relevance1) + "}",
2577
			"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), replace["+start1+", "+end1+"], token["+start1+", "+end1+"], " + (relevance1) + "}\n" +
2578
			"equalsFoo[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).equalsFoo(), Ltest.CompletionAfterInstanceOf;, ()V, Ltest.CompletionAfterInstanceOf;, equalsFoo, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
2564
			requestor.getResults());
2579
			requestor.getResults());
2565
}
2580
}
2566
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193909
2581
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193909
2567
// unsupported case
2582
// originally unsupported case - fixed with https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
2568
public void testCompletionAfterInstanceof07() throws JavaModelException {
2583
public void testCompletionAfterInstanceof07() throws JavaModelException {
2569
	this.workingCopies = new ICompilationUnit[1];
2584
	this.workingCopies = new ICompilationUnit[1];
2570
	this.workingCopies[0] = getWorkingCopy(
2585
	this.workingCopies[0] = getWorkingCopy(
Lines 2591-2598 Link Here
2591
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
2606
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
2592
	int start1 = str.lastIndexOf("equal") + "".length();
2607
	int start1 = str.lastIndexOf("equal") + "".length();
2593
	int end1 = start1 + "equal".length();
2608
	int end1 = start1 + "equal".length();
2609
	int start2 = str.lastIndexOf("a.equal");
2610
	int end2 = start2 + "a.equal".length();
2611
	int start3 = str.lastIndexOf("a.");
2612
	int end3 = start3 + "a".length();
2594
	assertResults(
2613
	assertResults(
2595
			"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), replace["+start1+", "+end1+"], token["+start1+", "+end1+"], " + (relevance1) + "}",
2614
			"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), replace["+start1+", "+end1+"], token["+start1+", "+end1+"], " + (relevance1) + "}\n" +
2615
			"equalsFoo[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).equalsFoo(), Ltest.CompletionAfterInstanceOf;, ()V, Ltest.CompletionAfterInstanceOf;, equalsFoo, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
2596
			requestor.getResults());
2616
			requestor.getResults());
2597
}
2617
}
2598
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193909
2618
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193909
Lines 20766-20769 Link Here
20766
			"returnZero[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).returnZero(), Ltest.CompletionAfterInstanceOf;, ()I, Ltest.CompletionAfterInstanceOf;, returnZero, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
20786
			"returnZero[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).returnZero(), Ltest.CompletionAfterInstanceOf;, ()I, Ltest.CompletionAfterInstanceOf;, returnZero, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
20767
			requestor.getResults());
20787
			requestor.getResults());
20768
}
20788
}
20789
20790
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
20791
// To verify that autocast works correctly after an instanceof even if there are other expressions in between
20792
// instanceof and the place where code assist is requested.
20793
public void testBug304006a() throws JavaModelException {
20794
	this.workingCopies = new ICompilationUnit[1];
20795
	this.workingCopies[0] = getWorkingCopy(
20796
		"/Completion/src/test/CompletionAfterInstanceOf.java",
20797
		"package test;\n" +
20798
		"public class CompletionAfterInstanceOf {\n" +
20799
		"	public int foo() { return 1; }\n" +
20800
		"	public int returnZero(){ return 0;}\n" +
20801
		"	void bar(Object a){\n" +
20802
		"       int i = 1;\n" +
20803
		"		if (a instanceof CompletionAfterInstanceOf) {" +
20804
		"			if (i == 1)\n" +
20805
		"				i =  a.r\n" +
20806
		"	}\n" +
20807
		"}\n");
20808
20809
	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, true, true, true, true);
20810
	requestor.allowAllRequiredProposals();
20811
	String str = this.workingCopies[0].getSource();
20812
	String completeBehind = "a.r";
20813
	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
20814
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
20815
20816
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED + R_EXACT_EXPECTED_TYPE;
20817
	int start1 = str.lastIndexOf("r") + "".length();
20818
	int end1 = start1 + "r".length();
20819
	int start2 = str.lastIndexOf("a.r");
20820
	int end2 = start2 + "a.r".length();
20821
	int start3 = str.lastIndexOf("a.");
20822
	int end3 = start3 + "a".length();
20823
	
20824
	assertResults(
20825
			"expectedTypesSignatures={I}\n" +
20826
			"expectedTypesKeys={I}",
20827
			requestor.getContext());
20828
	assertResults(
20829
			"returnZero[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).returnZero(), Ltest.CompletionAfterInstanceOf;, ()I, Ltest.CompletionAfterInstanceOf;, returnZero, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
20830
			requestor.getResults());
20831
}
20832
20833
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
20834
// To verify that autocast works correctly in a binary expression after an instanceof
20835
public void testBug304006b() throws JavaModelException {
20836
	this.workingCopies = new ICompilationUnit[1];
20837
	this.workingCopies[0] = getWorkingCopy(
20838
		"/Completion/src/test/CompletionAfterInstanceOf.java",
20839
		"package test;\n" +
20840
		"public class CompletionAfterInstanceOf {\n" +
20841
		"	public int foo() { return 1; }\n" +
20842
		"	public int returnZero(){ return 0;}\n" +
20843
		"	void bar(Object a){\n" +
20844
		"       int i = 1;\n" +
20845
		"		if (a instanceof CompletionAfterInstanceOf) {" +
20846
		"			if (i == 1 && a.r)\n" +
20847
		"	}\n" +
20848
		"}\n");
20849
20850
	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, true, true, true, true);
20851
	requestor.allowAllRequiredProposals();
20852
	String str = this.workingCopies[0].getSource();
20853
	String completeBehind = "a.r";
20854
	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
20855
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
20856
20857
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
20858
	int start1 = str.lastIndexOf("r") + "".length();
20859
	int end1 = start1 + "r".length();
20860
	int start2 = str.lastIndexOf("a.r");
20861
	int end2 = start2 + "a.r".length();
20862
	int start3 = str.lastIndexOf("a.");
20863
	int end3 = start3 + "a".length();
20864
	
20865
	assertResults(
20866
			"expectedTypesSignatures={Z}\n" +
20867
			"expectedTypesKeys={Z}",
20868
			requestor.getContext());
20869
	assertResults(
20870
			"returnZero[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).returnZero(), Ltest.CompletionAfterInstanceOf;, ()I, Ltest.CompletionAfterInstanceOf;, returnZero, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
20871
			requestor.getResults());
20872
}
20873
20874
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
20875
// To verify that autocast works correctly in a binary expression after an instanceof
20876
public void testBug304006c() throws JavaModelException {
20877
	this.workingCopies = new ICompilationUnit[1];
20878
	this.workingCopies[0] = getWorkingCopy(
20879
		"/Completion/src/test/CompletionAfterInstanceOf.java",
20880
		"package test;\n" +
20881
		"public class CompletionAfterInstanceOf {\n" +
20882
		"	public int foo() { return 1; }\n" +
20883
		"	public int returnZero(){ return 0;}\n" +
20884
		"	void bar(Object a){\n" +
20885
		"       int i = 1;\n" +
20886
		"		if (a instanceof CompletionAfterInstanceOf) {" +
20887
		"			if (i == 1 || a.r)\n" +
20888
		"	}\n" +
20889
		"}\n");
20890
20891
	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, true, true, true, true);
20892
	requestor.allowAllRequiredProposals();
20893
	String str = this.workingCopies[0].getSource();
20894
	String completeBehind = "a.r";
20895
	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
20896
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
20897
20898
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
20899
	int start1 = str.lastIndexOf("r") + "".length();
20900
	int end1 = start1 + "r".length();
20901
	int start2 = str.lastIndexOf("a.r");
20902
	int end2 = start2 + "a.r".length();
20903
	int start3 = str.lastIndexOf("a.");
20904
	int end3 = start3 + "a".length();
20905
	
20906
	assertResults(
20907
			"expectedTypesSignatures={Z}\n" +
20908
			"expectedTypesKeys={Z}",
20909
			requestor.getContext());
20910
	assertResults(
20911
			"returnZero[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).returnZero(), Ltest.CompletionAfterInstanceOf;, ()I, Ltest.CompletionAfterInstanceOf;, returnZero, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
20912
			requestor.getResults());
20913
}
20914
20915
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
20916
// To verify that autocast works correctly in a binary expression after an instanceof
20917
public void testBug304006d() throws JavaModelException {
20918
	this.workingCopies = new ICompilationUnit[1];
20919
	this.workingCopies[0] = getWorkingCopy(
20920
		"/Completion/src/test/CompletionAfterInstanceOf.java",
20921
		"package test;\n" +
20922
		"public class CompletionAfterInstanceOf {\n" +
20923
		"	public int foo() { return 1; }\n" +
20924
		"	public int returnZero(){ return 0;}\n" +
20925
		"	void bar(Object a){\n" +
20926
		"       int i = 1;\n" +
20927
		"		if (a instanceof CompletionAfterInstanceOf) {" +
20928
		"			if (i == 1 & a.r)\n" +
20929
		"	}\n" +
20930
		"}\n");
20931
20932
	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, true, true, true, true);
20933
	requestor.allowAllRequiredProposals();
20934
	String str = this.workingCopies[0].getSource();
20935
	String completeBehind = "a.r";
20936
	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
20937
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
20938
20939
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
20940
	int start1 = str.lastIndexOf("r") + "".length();
20941
	int end1 = start1 + "r".length();
20942
	int start2 = str.lastIndexOf("a.r");
20943
	int end2 = start2 + "a.r".length();
20944
	int start3 = str.lastIndexOf("a.");
20945
	int end3 = start3 + "a".length();
20946
	
20947
	assertResults(
20948
			"expectedTypesSignatures={Z}\n" +
20949
			"expectedTypesKeys={Z}",
20950
			requestor.getContext());
20951
	assertResults(
20952
			"returnZero[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).returnZero(), Ltest.CompletionAfterInstanceOf;, ()I, Ltest.CompletionAfterInstanceOf;, returnZero, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
20953
			requestor.getResults());
20954
}
20955
20956
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
20957
// To verify that autocast works correctly in a binary expression after an instanceof
20958
public void testBug304006e() throws JavaModelException {
20959
	this.workingCopies = new ICompilationUnit[1];
20960
	this.workingCopies[0] = getWorkingCopy(
20961
		"/Completion/src/test/CompletionAfterInstanceOf.java",
20962
		"package test;\n" +
20963
		"public class CompletionAfterInstanceOf {\n" +
20964
		"	public int foo() { return 1; }\n" +
20965
		"	public int returnZero(){ return 0;}\n" +
20966
		"	void bar(Object a){\n" +
20967
		"       int i = 1;\n" +
20968
		"		if (a instanceof CompletionAfterInstanceOf) {" +
20969
		"			if (i == 1 | a.r)\n" +
20970
		"	}\n" +
20971
		"}\n");
20972
20973
	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, true, true, true, true);
20974
	requestor.allowAllRequiredProposals();
20975
	String str = this.workingCopies[0].getSource();
20976
	String completeBehind = "a.r";
20977
	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
20978
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
20979
20980
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
20981
	int start1 = str.lastIndexOf("r") + "".length();
20982
	int end1 = start1 + "r".length();
20983
	int start2 = str.lastIndexOf("a.r");
20984
	int end2 = start2 + "a.r".length();
20985
	int start3 = str.lastIndexOf("a.");
20986
	int end3 = start3 + "a".length();
20987
	
20988
	assertResults(
20989
			"expectedTypesSignatures={Z}\n" +
20990
			"expectedTypesKeys={Z}",
20991
			requestor.getContext());
20992
	assertResults(
20993
			"returnZero[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).returnZero(), Ltest.CompletionAfterInstanceOf;, ()I, Ltest.CompletionAfterInstanceOf;, returnZero, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
20994
			requestor.getResults());
20995
}
20996
20997
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
20998
// To verify that autocast works correctly in a binary expression after an instanceof
20999
public void testBug304006f() throws JavaModelException {
21000
	this.workingCopies = new ICompilationUnit[1];
21001
	this.workingCopies[0] = getWorkingCopy(
21002
		"/Completion/src/test/CompletionAfterInstanceOf.java",
21003
		"package test;\n" +
21004
		"public class CompletionAfterInstanceOf {\n" +
21005
		"	public int foo() { return 1; }\n" +
21006
		"	public int returnZero(){ return 0;}\n" +
21007
		"	void bar(Object a){\n" +
21008
		"       int i = 1, j;\n" +
21009
		"		if (a instanceof CompletionAfterInstanceOf) {" +
21010
		"			if (j = a.r)\n" +
21011
		"	}\n" +
21012
		"}\n");
21013
21014
	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, true, true, true, true);
21015
	requestor.allowAllRequiredProposals();
21016
	String str = this.workingCopies[0].getSource();
21017
	String completeBehind = "a.r";
21018
	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
21019
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
21020
21021
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
21022
	int start1 = str.lastIndexOf("r") + "".length();
21023
	int end1 = start1 + "r".length();
21024
	int start2 = str.lastIndexOf("a.r");
21025
	int end2 = start2 + "a.r".length();
21026
	int start3 = str.lastIndexOf("a.");
21027
	int end3 = start3 + "a".length();
21028
	
21029
	assertResults(
21030
			"expectedTypesSignatures={Z}\n" +
21031
			"expectedTypesKeys={Z}",
21032
			requestor.getContext());
21033
	assertResults(
21034
			"returnZero[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).returnZero(), Ltest.CompletionAfterInstanceOf;, ()I, Ltest.CompletionAfterInstanceOf;, returnZero, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
21035
			requestor.getResults());
21036
}
21037
21038
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
21039
// To verify that autocast works correctly in a binary expression after an instanceof
21040
public void testBug304006g() throws JavaModelException {
21041
	this.workingCopies = new ICompilationUnit[1];
21042
	this.workingCopies[0] = getWorkingCopy(
21043
		"/Completion/src/test/CompletionAfterInstanceOf.java",
21044
		"package test;\n" +
21045
		"public class CompletionAfterInstanceOf {\n" +
21046
		"	public int foo() { return 1; }\n" +
21047
		"	public int returnZero(){ return 0;}\n" +
21048
		"	void bar(Object a){\n" +
21049
		"       int i = 1, j;\n" +
21050
		"		if (a instanceof CompletionAfterInstanceOf) {" +
21051
		"			if (i == a.r)\n" +
21052
		"	}\n" +
21053
		"}\n");
21054
21055
	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, true, true, true, true);
21056
	requestor.allowAllRequiredProposals();
21057
	String str = this.workingCopies[0].getSource();
21058
	String completeBehind = "a.r";
21059
	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
21060
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
21061
21062
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
21063
	int start1 = str.lastIndexOf("r") + "".length();
21064
	int end1 = start1 + "r".length();
21065
	int start2 = str.lastIndexOf("a.r");
21066
	int end2 = start2 + "a.r".length();
21067
	int start3 = str.lastIndexOf("a.");
21068
	int end3 = start3 + "a".length();
21069
	
21070
	assertResults(
21071
			"expectedTypesSignatures={Z}\n" +
21072
			"expectedTypesKeys={Z}",
21073
			requestor.getContext());
21074
	assertResults(
21075
			"returnZero[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).returnZero(), Ltest.CompletionAfterInstanceOf;, ()I, Ltest.CompletionAfterInstanceOf;, returnZero, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
21076
			requestor.getResults());
21077
}
21078
21079
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
21080
// To verify that autocast works correctly in a binary expression after an instanceof
21081
public void testBug304006h() throws JavaModelException {
21082
	this.workingCopies = new ICompilationUnit[1];
21083
	this.workingCopies[0] = getWorkingCopy(
21084
		"/Completion/src/test/CompletionAfterInstanceOf.java",
21085
		"package test;\n" +
21086
		"public class CompletionAfterInstanceOf {\n" +
21087
		"	public int foo() { return 1; }\n" +
21088
		"	public int returnZero(){ return 0;}\n" +
21089
		"	void bar(Object a){\n" +
21090
		"       int i = 1, j;\n" +
21091
		"		if (a instanceof CompletionAfterInstanceOf) {" +
21092
		"			if (i != a.r)\n" +
21093
		"	}\n" +
21094
		"}\n");
21095
21096
	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, true, true, true, true);
21097
	requestor.allowAllRequiredProposals();
21098
	String str = this.workingCopies[0].getSource();
21099
	String completeBehind = "a.r";
21100
	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
21101
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
21102
21103
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED;
21104
	int start1 = str.lastIndexOf("r") + "".length();
21105
	int end1 = start1 + "r".length();
21106
	int start2 = str.lastIndexOf("a.r");
21107
	int end2 = start2 + "a.r".length();
21108
	int start3 = str.lastIndexOf("a.");
21109
	int end3 = start3 + "a".length();
21110
	
21111
	assertResults(
21112
			"expectedTypesSignatures={Z}\n" +
21113
			"expectedTypesKeys={Z}",
21114
			requestor.getContext());
21115
	assertResults(
21116
			"returnZero[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)a).returnZero(), Ltest.CompletionAfterInstanceOf;, ()I, Ltest.CompletionAfterInstanceOf;, returnZero, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
21117
			requestor.getResults());
21118
}
21119
21120
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
21121
// To verify that autocast works correctly even when the completion node
21122
// is preceeded by a number of unrelated instanceof expressions
21123
public void testBug304006i() throws JavaModelException {
21124
	this.workingCopies = new ICompilationUnit[1];
21125
	this.workingCopies[0] = getWorkingCopy(
21126
		"/Completion/src/test/CompletionAfterInstanceOf.java",
21127
		"package test;\n" +
21128
		"public class CompletionAfterInstanceOf {\n" +
21129
		"	public int foo() { return 1; }\n" +
21130
		"	public int returnZero(){ return 0;}\n" +
21131
		"	void bar(Object abc, Object xyz){\n" +
21132
		"       int i = 1, j;\n" +
21133
		"		if(i == 1)\n" +
21134
		"			if (abc instanceof CompletionAfterInstanceOf)\n" +
21135
		"				if(xyz instanceof CompletionAfterInstanceOf){\n" +
21136
		"					j = 1;\n" +
21137
		"					if(j == 1)\n" +
21138
		"						i = abc.r \n" +
21139
		"				}\n" +
21140
		"	}\n" +
21141
		"}\n");
21142
21143
	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, true, true, true, true);
21144
	requestor.allowAllRequiredProposals();
21145
	String str = this.workingCopies[0].getSource();
21146
	String completeBehind = "abc.r";
21147
	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
21148
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
21149
21150
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED + R_EXACT_EXPECTED_TYPE;
21151
	int start1 = str.lastIndexOf("r") + "".length();
21152
	int end1 = start1 + "r".length();
21153
	int start2 = str.lastIndexOf("abc.r");
21154
	int end2 = start2 + "abc.r".length();
21155
	int start3 = str.lastIndexOf("abc.");
21156
	int end3 = start3 + "abc".length();
21157
	
21158
	assertResults(
21159
			"expectedTypesSignatures={I}\n" +
21160
			"expectedTypesKeys={I}",
21161
			requestor.getContext());
21162
	assertResults(
21163
			"returnZero[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)abc).returnZero(), Ltest.CompletionAfterInstanceOf;, ()I, Ltest.CompletionAfterInstanceOf;, returnZero, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
21164
			requestor.getResults());
21165
}
21166
21167
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304006
21168
// To verify that autocast works correctly even when the completion node
21169
// is preceeded by a number of unrelated instanceof expressions
21170
public void testBug304006j() throws JavaModelException {
21171
	this.workingCopies = new ICompilationUnit[1];
21172
	this.workingCopies[0] = getWorkingCopy(
21173
		"/Completion/src/test/CompletionAfterInstanceOf.java",
21174
		"package test;\n" +
21175
		"public class CompletionAfterInstanceOf {\n" +
21176
		"	public int foo() { return 1; }\n" +
21177
		"	public int returnZero(){ return 0;}\n" +
21178
		"	void bar(Object abc, Object xyz){\n" +
21179
		"       int i = 1, j;\n" +
21180
		"		if(i == 1)\n" +
21181
		"			if (abc instanceof CompletionAfterInstanceOf)\n" +
21182
		"				if(xyz instanceof CompletionAfterInstanceOf){\n" +
21183
		"					j = 1;\n" +
21184
		"					if(j == 1)\n" +
21185
		"						i = xyz.r \n" +
21186
		"				}\n" +
21187
		"	}\n" +
21188
		"}\n");
21189
21190
	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, true, true, true, true);
21191
	requestor.allowAllRequiredProposals();
21192
	String str = this.workingCopies[0].getSource();
21193
	String completeBehind = "xyz.r";
21194
	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
21195
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
21196
21197
	int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_STATIC + R_NON_RESTRICTED + R_EXACT_EXPECTED_TYPE;
21198
	int start1 = str.lastIndexOf("r") + "".length();
21199
	int end1 = start1 + "r".length();
21200
	int start2 = str.lastIndexOf("xyz.r");
21201
	int end2 = start2 + "xyz.r".length();
21202
	int start3 = str.lastIndexOf("xyz.");
21203
	int end3 = start3 + "xyz".length();
21204
	
21205
	assertResults(
21206
			"expectedTypesSignatures={I}\n" +
21207
			"expectedTypesKeys={I}",
21208
			requestor.getContext());
21209
	assertResults(
21210
			"returnZero[METHOD_REF_WITH_CASTED_RECEIVER]{((CompletionAfterInstanceOf)xyz).returnZero(), Ltest.CompletionAfterInstanceOf;, ()I, Ltest.CompletionAfterInstanceOf;, returnZero, null, replace["+start2+", "+end2+"], token["+start1+", "+end1+"], receiver["+start3+", "+end3+"], " + (relevance1) + "}",
21211
			requestor.getResults());
21212
}
20769
}
21213
}

Return to bug 304006