### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java,v retrieving revision 1.320 diff -u -r1.320 MatchLocator.java --- search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java 12 Feb 2009 16:54:27 -0000 1.320 +++ search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java 17 Feb 2009 17:10:48 -0000 @@ -1403,7 +1403,15 @@ if (reference instanceof QualifiedNameReference) { char[][] tokens = ((QualifiedNameReference)reference).tokens; char[] lastToken = tokens[tokens.length-1]; - if (!this.patternLocator.matchesName(((VariablePattern)this.pattern).name, lastToken)) { + if (this.pattern instanceof OrPattern) { + SearchPattern[] patterns = ((OrPattern) this.pattern).patterns; + for (int i = 0, pLength = patterns.length; i < pLength; i++) { + if (!this.patternLocator.matchesName(((VariablePattern)patterns[i]).name, lastToken)) { + isWriteAccess = false; + isReadAccess = true; + } + } + } else if (!this.patternLocator.matchesName(((VariablePattern)this.pattern).name, lastToken)) { isWriteAccess = false; isReadAccess = true; } @@ -1434,7 +1442,15 @@ if (reference instanceof QualifiedNameReference) { char[][] tokens = ((QualifiedNameReference)reference).tokens; char[] lastToken = tokens[tokens.length-1]; - if (!this.patternLocator.matchesName(((VariablePattern)this.pattern).name, lastToken)) { + if (this.pattern instanceof OrPattern) { + SearchPattern[] patterns = ((OrPattern) this.pattern).patterns; + for (int i = 0, pLength = patterns.length; i < pLength; i++) { + if (!this.patternLocator.matchesName(((VariablePattern)patterns[i]).name, lastToken)) { + isWriteAccess = false; + isReadAccess = true; + } + } + } else if (!this.patternLocator.matchesName(((VariablePattern)this.pattern).name, lastToken)) { isWriteAccess = false; isReadAccess = true; } #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java,v retrieving revision 1.163 diff -u -r1.163 JavaSearchBugsTests.java --- src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java 16 Jan 2009 14:29:34 -0000 1.163 +++ src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java 17 Feb 2009 17:10:54 -0000 @@ -10424,4 +10424,95 @@ deleteProject("P"); } } + + +/** + * @bug 265065: [search] java.lang.ClassCastException while running "Refactor...Extract Class" + * @test Ensure that no CCE occurs while using an OrPattern made of VariablePattern + * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=265065" + */ +public void testBug265065() throws CoreException { + this.workingCopies = new ICompilationUnit[1]; + this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/MyClass.java", + "public class MyClass {\n" + + " class MyPrivateClass {\n" + + " public String type = TYPE_A;\n" + + " public Object value = null;\n" + + " public MyPrivateClass(String type, Object value) {\n" + + " this.type = type;\n" + + " this.value = value;\n" + + " }\n" + + " }\n" + + "\n" + + " private static final String TYPE_A = \"A\";\n" + + " private static final String TYPE_B = \"B\";\n" + + " private static final String TYPE_C = \"C\";\n" + + "\n" + + " void foo (Object value) {\n" + + " MyPrivateClass mpc = new MyPrivateClass(TYPE_B, value);\n" + + " if (mpc.value == null) {\n" + + " mpc.type = TYPE_C;\n" + + " }\n" + + " }\n" + + "}\n" + ); + this.resultCollector.showRule(); + this.resultCollector.showAccess(); + SearchPattern leftPattern = SearchPattern.createPattern("MyClass.MyPrivateClass.value Object", FIELD, ALL_OCCURRENCES, SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE); + SearchPattern rightPattern = SearchPattern.createPattern("MyClass.MyPrivateClass.type String", FIELD, ALL_OCCURRENCES, SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE); + new SearchEngine(this.workingCopies).search( + SearchPattern.createOrPattern(leftPattern, rightPattern), + new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, + getJavaSearchWorkingCopiesScope(), + this.resultCollector, + null); + assertSearchResults( + "src/MyClass.java void MyClass.foo(Object) [value] EXACT_MATCH READ ACCESS\n" + + "src/MyClass.java void MyClass.foo(Object) [type] EXACT_MATCH READ ACCESS\n" + + "src/MyClass.java MyClass$MyPrivateClass.type [type] EXACT_MATCH\n" + + "src/MyClass.java MyClass$MyPrivateClass.value [value] EXACT_MATCH\n" + + "src/MyClass.java MyClass$MyPrivateClass(String, Object) [type] EXACT_MATCH WRITE ACCESS\n" + + "src/MyClass.java MyClass$MyPrivateClass(String, Object) [value] EXACT_MATCH WRITE ACCESS" + ); +} +public void testBug265065b() throws CoreException { + this.workingCopies = new ICompilationUnit[2]; + this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/pack/Test.java", + "package pack;\n" + + "public class Test {\n" + + " public int field;\n" + + "}\n" + ); + this.workingCopies[1] = getWorkingCopy("/JavaSearchBugs/src/test/X.java", + "package test;\n" + + "import pack.Test;\n" + + "public class X {\n" + + " void foo(Test t1, Test t2) {\n" + + " t1 = t2;\n" + + " t1.field = t1.field;\n" + + " t2.field = t1.field;\n" + + " }\n" + + "}\n" + ); + this.resultCollector.showAccess(); + ILocalVariable localVar1 = selectLocalVariable(this.workingCopies[1], "t1"); + SearchPattern leftPattern = createPattern(localVar1, IJavaSearchConstants.REFERENCES); + ILocalVariable localVar2 = selectLocalVariable(this.workingCopies[1], "t2"); + SearchPattern rightPattern = createPattern(localVar2, IJavaSearchConstants.REFERENCES); + new SearchEngine(this.workingCopies).search( + SearchPattern.createOrPattern(leftPattern, rightPattern), + new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, + getJavaSearchWorkingCopiesScope(), + this.resultCollector, + null); + assertSearchResults( + "src/test/X.java void test.X.foo(Test, Test) [t1] EXACT_MATCH WRITE ACCESS\n" + + "src/test/X.java void test.X.foo(Test, Test) [t2] EXACT_MATCH READ ACCESS\n" + + "src/test/X.java void test.X.foo(Test, Test) [t1] EXACT_MATCH READ ACCESS\n" + + "src/test/X.java void test.X.foo(Test, Test) [t1] EXACT_MATCH READ ACCESS\n" + + "src/test/X.java void test.X.foo(Test, Test) [t2] EXACT_MATCH READ ACCESS\n" + + "src/test/X.java void test.X.foo(Test, Test) [t1] EXACT_MATCH READ ACCESS" + ); +} + } \ No newline at end of file