From 345771a1d2f9eed30aa60017aa63d5acc7dd4d2c Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Mon, 2 May 2011 13:04:46 +0400 Subject: [PATCH] NPE & SOE on array access converting --- .../jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java | 3 ++- .../groovy/refactoring/convertToJava/ExpressionGenerator.java | 2 +- .../refactoring/convertToJava/CodeBlockGenerationTest.groovy | 3 +++ .../convertGroovyToJava/codeBlock/arrayAccess.groovy | 2 ++ .../refactoring/convertGroovyToJava/codeBlock/arrayAccess.java | 2 ++ .../convertGroovyToJava/codeBlock/unresolvedArrayAccess.groovy | 2 ++ .../convertGroovyToJava/codeBlock/unresolvedArrayAccess.java | 2 ++ 7 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/arrayAccess.groovy create mode 100644 plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/arrayAccess.java create mode 100644 plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/unresolvedArrayAccess.groovy create mode 100644 plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/unresolvedArrayAccess.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java index a7e3abbb434d..58415b615491 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java @@ -448,9 +448,10 @@ public class PsiImplUtil { TypesUtil.isAssignable(PsiType.INT, argTypes[0], manager, resolveScope); } - public static GroovyResolveResult getIndexPropertyMethodCandidate(PsiType thisType, + public static GroovyResolveResult getIndexPropertyMethodCandidate(@Nullable PsiType thisType, PsiType[] argTypes, GroovyPsiElement place) { + if (thisType == null) return GroovyResolveResult.EMPTY_RESULT; GroovyResolveResult[] candidates = ResolveUtil.getMethodCandidates(thisType, "getAt", place, argTypes); if (candidates.length != 1) { final GrTupleType tupleType = new GrTupleType(argTypes, JavaPsiFacade.getInstance(place.getProject()), place.getResolveScope()); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java index 66c4948177b7..ee9219882c3e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java @@ -758,7 +758,7 @@ public class ExpressionGenerator extends Generator { final GrNamedArgument[] namedArgs = argList.getNamedArguments(); if (PsiImplUtil.isSimpleArrayAccess(thisType, argTypes, manager, resolveScope)) { - expression.accept(this); + selectedExpression.accept(this); builder.append("["); final GrExpression arg = exprArgs[0]; arg.accept(this); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerationTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerationTest.groovy index de826a9dc7f3..65ca241d1e3d 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerationTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerationTest.groovy @@ -150,4 +150,7 @@ public final class Matcher { void testAnonymousFromMap() {doTest()} void testClosure() {doTest()} void _testListAsArray() {doTest()} + + void testUnresolvedArrayAccess() {doTest()} + void testArrayAccess() {doTest()} } diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/arrayAccess.groovy b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/arrayAccess.groovy new file mode 100644 index 000000000000..640705b9b8b6 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/arrayAccess.groovy @@ -0,0 +1,2 @@ +int[] foo = [1, 2, 3] +print foo[2] \ No newline at end of file diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/arrayAccess.java b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/arrayAccess.java new file mode 100644 index 000000000000..dc66b403039e --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/arrayAccess.java @@ -0,0 +1,2 @@ +java.lang.Integer[] foo = new java.lang.Integer[]{1, 2, 3}; +print(foo[2]); diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/unresolvedArrayAccess.groovy b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/unresolvedArrayAccess.groovy new file mode 100644 index 000000000000..56c70b3ab2ec --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/unresolvedArrayAccess.groovy @@ -0,0 +1,2 @@ +def foo +print(foo[1]) \ No newline at end of file diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/unresolvedArrayAccess.java b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/unresolvedArrayAccess.java new file mode 100644 index 000000000000..bf6515e7cb67 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/unresolvedArrayAccess.java @@ -0,0 +1,2 @@ +java.lang.Object foo; +print(foo.getAt(1));