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

Collapse All | Expand All

(-)src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java (-2 / +13 lines)
Lines 36-42 Link Here
36
*/
36
*/
37
public class AttachSourceTests extends ModifyingResourceTests {
37
public class AttachSourceTests extends ModifyingResourceTests {
38
	static {
38
	static {
39
//		TESTS_NAMES = new String[] { "testClassFileGetElementAt04" };
39
//		TESTS_NAMES = new String[] { "testClassFileBuffer" };
40
//		TESTS_NUMBERS = new int[] { 5 };
40
//		TESTS_NUMBERS = new int[] { 5 };
41
//		TESTS_RANGE = new int[] { 169, 180 };
41
//		TESTS_RANGE = new int[] { 169, 180 };
42
	}
42
	}
Lines 312-318 Link Here
312
		"Unexpected element",
312
		"Unexpected element",
313
		"V(inner.X, java.lang.String) [in V [in X$V.class [in inner [in innerClasses.jar [in AttachSourceTests]]]]]",
313
		"V(inner.X, java.lang.String) [in V [in X$V.class [in inner [in innerClasses.jar [in AttachSourceTests]]]]]",
314
		element);
314
		element);
315
}/*
315
}
316
/*
316
 * Ensures that the source of a .class file is implicetely attached when prj=src=bin
317
 * Ensures that the source of a .class file is implicetely attached when prj=src=bin
317
 * (regression test for bug 41444 [navigation] error dialog on opening class file)
318
 * (regression test for bug 41444 [navigation] error dialog on opening class file)
318
 */
319
 */
Lines 1484-1487 Link Here
1484
	assertFalse(SourceRange.isAvailable(null));
1485
	assertFalse(SourceRange.isAvailable(null));
1485
	assertFalse(SourceRange.isAvailable(new SourceRange(-1, 0)));
1486
	assertFalse(SourceRange.isAvailable(new SourceRange(-1, 0)));
1486
}
1487
}
1488
/*
1489
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=285230
1490
 */
1491
public void testClassFileBuffer() throws JavaModelException {
1492
	IClassFile classFile = this.innerClasses.getClassFile("X$V.class");
1493
	IBuffer buffer = classFile.getBuffer();
1494
	classFile = this.innerClasses.getClassFile("X.class");
1495
	IBuffer buffer2 = classFile.getBuffer();
1496
	assertTrue("Same buffer is not reused", buffer2 == buffer);
1497
}
1487
}
1498
}
(-)model/org/eclipse/jdt/internal/core/SourceMapper.java (-1 / +4 lines)
Lines 1208-1214 Link Here
1208
		this.methodParameterNames = new char[1][][];
1208
		this.methodParameterNames = new char[1][][];
1209
		this.anonymousCounter = 0;
1209
		this.anonymousCounter = 0;
1210
1210
1211
		HashMap oldSourceRanges = (HashMap) this.sourceRanges.clone();
1211
		HashMap oldSourceRanges = null;
1212
		if (elementToFind != null) {
1213
			oldSourceRanges = (HashMap) this.sourceRanges.clone();
1214
		}
1212
		try {
1215
		try {
1213
			IProblemFactory factory = new DefaultProblemFactory();
1216
			IProblemFactory factory = new DefaultProblemFactory();
1214
			SourceElementParser parser = null;
1217
			SourceElementParser parser = null;
(-)model/org/eclipse/jdt/internal/core/ClassFile.java (-8 / +27 lines)
Lines 625-641 Link Here
625
 * @see Openable
625
 * @see Openable
626
 */
626
 */
627
protected IBuffer openBuffer(IProgressMonitor pm, Object info) throws JavaModelException {
627
protected IBuffer openBuffer(IProgressMonitor pm, Object info) throws JavaModelException {
628
	SourceMapper mapper = getSourceMapper();
628
	// Check the cache for the top-level type first
629
	if (mapper != null) {
629
	IType outerMostEnclosingType = getOuterMostEnclosingType();
630
		return mapSource(mapper, info instanceof IBinaryType ? (IBinaryType) info : null);
630
	IBuffer buffer = getBufferManager().getBuffer(outerMostEnclosingType.getClassFile());
631
	if (buffer == null) {
632
		SourceMapper mapper = getSourceMapper();
633
		IBinaryType typeInfo = info instanceof IBinaryType ? (IBinaryType) info : null;
634
		if (mapper != null) {
635
			buffer = mapSource(mapper, typeInfo, outerMostEnclosingType.getClassFile());
636
		}
631
	}
637
	}
632
	return null;
638
	return buffer;
633
}
639
}
634
private IBuffer mapSource(SourceMapper mapper, IBinaryType info) {
640
/** Loads the buffer via SourceMapper, and maps it in SourceMapper */
641
private IBuffer mapSource(SourceMapper mapper, IBinaryType info, IClassFile bufferOwner) {
635
	char[] contents = mapper.findSource(getType(), info);
642
	char[] contents = mapper.findSource(getType(), info);
636
	if (contents != null) {
643
	if (contents != null) {
637
		// create buffer
644
		// create buffer
638
		IBuffer buffer = BufferManager.createBuffer(this);
645
		IBuffer buffer = BufferManager.createBuffer(bufferOwner);
639
		if (buffer == null) return null;
646
		if (buffer == null) return null;
640
		BufferManager bufManager = getBufferManager();
647
		BufferManager bufManager = getBufferManager();
641
		bufManager.addBuffer(buffer);
648
		bufManager.addBuffer(buffer);
Lines 649-660 Link Here
649
		buffer.addBufferChangedListener(this);
656
		buffer.addBufferChangedListener(this);
650
657
651
		// do the source mapping
658
		// do the source mapping
652
		mapper.mapSource(getType(), contents, info);
659
		mapper.mapSource(getOuterMostEnclosingType(), contents, info);
653
660
654
		return buffer;
661
		return buffer;
655
	} else {
662
	} else {
656
		// create buffer
663
		// create buffer
657
		IBuffer buffer = BufferManager.createNullBuffer(this);
664
		IBuffer buffer = BufferManager.createNullBuffer(bufferOwner);
658
		if (buffer == null) return null;
665
		if (buffer == null) return null;
659
		BufferManager bufManager = getBufferManager();
666
		BufferManager bufManager = getBufferManager();
660
		bufManager.addBuffer(buffer);
667
		bufManager.addBuffer(buffer);
Lines 674-679 Link Here
674
	else
681
	else
675
		return simpleName;
682
		return simpleName;
676
}
683
}
684
685
/** Returns the type of the top-level declaring class used to find the source code */
686
private IType getOuterMostEnclosingType() {
687
	IType type = getType();
688
	IType enclosingType = type.getDeclaringType();
689
	while (enclosingType != null) {
690
		type = enclosingType;
691
		enclosingType = type.getDeclaringType();
692
	}
693
	return type;
694
}
695
677
/**
696
/**
678
 * Returns the Java Model representation of the given name
697
 * Returns the Java Model representation of the given name
679
 * which is provided in diet class file format, or <code>null</code>
698
 * which is provided in diet class file format, or <code>null</code>

Return to bug 285230