From 953d14db656f1cc38555537d7646528232fce06f Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Thu, 5 Jan 2012 17:45:12 +0400 Subject: [PATCH] groovy top level classes cannot have private and protected modifiers --- .../modifiers/GrModifierListImpl.java | 8 ++++ .../groovy/lang/GroovyHighlightingTest.groovy | 14 ++++++ ...Case.java => GroovyResolveTestCase.groovy} | 41 +++++++++------- ...st.java => JavaToGroovyResolveTest.groovy} | 47 ++++++++++++------- .../lang/resolve/ResolveMethodTest.groovy | 6 --- .../lang/resolve/ResolvePropertyTest.groovy | 6 --- 6 files changed, 76 insertions(+), 46 deletions(-) rename plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/{GroovyResolveTestCase.java => GroovyResolveTestCase.groovy} (69%) rename plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/{JavaToGroovyResolveTest.java => JavaToGroovyResolveTest.groovy} (68%) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/modifiers/GrModifierListImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/modifiers/GrModifierListImpl.java index 3684b97bef5c..1916534231e6 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/modifiers/GrModifierListImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/modifiers/GrModifierListImpl.java @@ -45,6 +45,8 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.GrStubElementBase; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrModifierListStub; import org.jetbrains.plugins.groovy.lang.resolve.noncode.ConstructorAnnotationsProcessor; +import static org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier.*; + /** * @autor: Dmitry.Krasilschikov * @date: 18.03.2007 @@ -170,6 +172,12 @@ public class GrModifierListImpl extends GrStubElementBase im } } + //top level classes cannot have private and protected modifiers + if (owner instanceof GrTypeDefinition && ((GrTypeDefinition)owner).getContainingClass() == null) { + if (modifier.equals(PROTECTED) || modifier.equals(PRIVATE)) return false; + if (modifier.equals(PACKAGE_LOCAL)) return modifierList.hasExplicitModifier(PRIVATE) || modifierList.hasExplicitModifier(PROTECTED); + } + if (modifierList.hasExplicitModifier(modifier)) { return true; } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.groovy index 72ed84af5b4e..b839422d1e34 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.groovy @@ -574,4 +574,18 @@ class A { ''') myFixture.checkHighlighting(true, false, false) } + + void testPrivateTopLevelClassInJava() { + myFixture.addFileToProject('pack/Foo.groovy', 'package pack; private class Foo{}') + myFixture.configureByText('Abc.java', '''\ +import pack.Foo; + +class Abc { + void foo() { + System.out.print(new Foo()); + } +}''') + + myFixture.testHighlighting(false, false, false) + } } \ No newline at end of file diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/GroovyResolveTestCase.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/GroovyResolveTestCase.groovy similarity index 69% rename from plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/GroovyResolveTestCase.java rename to plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/GroovyResolveTestCase.groovy index da1c30bc069e..d7633e965c48 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/GroovyResolveTestCase.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/GroovyResolveTestCase.groovy @@ -16,19 +16,17 @@ package org.jetbrains.plugins.groovy.lang.resolve; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.VfsUtil; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiReference; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.groovy.LightGroovyTestCase; -import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; -import java.io.File; -import java.io.IOException; +import com.intellij.openapi.util.text.StringUtil +import com.intellij.openapi.vfs.VfsUtil +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiReference +import org.jetbrains.annotations.NonNls +import org.jetbrains.annotations.Nullable +import org.jetbrains.plugins.groovy.LightGroovyTestCase +import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression /** * @author ven @@ -39,15 +37,15 @@ public abstract class GroovyResolveTestCase extends LightGroovyTestCase { @Override protected void setUp() throws Exception { super.setUp(); - if (new File(myFixture.getTestDataPath() + "/" + getTestName(true)).exists()) { + if (new File("$myFixture.testDataPath/${getTestName(true)}").exists()) { myFixture.copyDirectoryToProject(getTestName(true), ""); } } protected PsiReference configureByFile(@NonNls String filePath, @Nullable String newFilePath) { filePath = StringUtil.trimStart(filePath, getTestName(true) + "/"); - final VirtualFile vFile = myFixture.getTempDirFixture().getFile(filePath); - assertNotNull("file " + filePath + " not found", vFile); + final VirtualFile vFile = myFixture.tempDirFixture.getFile(filePath); + assertNotNull("file $filePath not found", vFile); String fileText; try { @@ -62,13 +60,13 @@ public abstract class GroovyResolveTestCase extends LightGroovyTestCase { fileText = fileText.substring(0, offset) + fileText.substring(offset + MARKER.length()); if (newFilePath == null) { - myFixture.configureByText("aaa." + vFile.getExtension(), fileText); + myFixture.configureByText("aaa." + vFile.extension, fileText); } else { myFixture.configureByText(newFilePath, fileText); } - PsiReference ref = myFixture.getFile().findReferenceAt(offset); + PsiReference ref = myFixture.file.findReferenceAt(offset); assertNotNull(ref); return ref; } @@ -77,6 +75,15 @@ public abstract class GroovyResolveTestCase extends LightGroovyTestCase { return configureByFile(filePath, null); } + protected PsiReference configureByText(String text) { + configureByText('a.groovy', text); + } + + protected PsiReference configureByText(String fileName, String text) { + myFixture.configureByText fileName, text + return myFixture.file.findReferenceAt(myFixture.editor.caretModel.offset) + } + @Nullable protected PsiElement resolve(String fileName) { PsiReference ref = configureByFile(getTestName(true) + "/" + fileName); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/JavaToGroovyResolveTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/JavaToGroovyResolveTest.groovy similarity index 68% rename from plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/JavaToGroovyResolveTest.java rename to plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/JavaToGroovyResolveTest.groovy index 5f07809fade0..fa983cc88e85 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/JavaToGroovyResolveTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/JavaToGroovyResolveTest.groovy @@ -16,15 +16,16 @@ package org.jetbrains.plugins.groovy.lang.resolve; -import com.intellij.psi.JavaResolveResult; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiJavaReference; -import com.intellij.psi.PsiReference; -import com.intellij.psi.impl.light.LightMethodBuilder; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAccessorMethod; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; -import org.jetbrains.plugins.groovy.util.TestUtils; + +import com.intellij.psi.JavaResolveResult +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiJavaReference +import com.intellij.psi.PsiReference +import com.intellij.psi.impl.light.LightMethodBuilder +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAccessorMethod +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod +import org.jetbrains.plugins.groovy.util.TestUtils /** * @author ven @@ -32,7 +33,7 @@ import org.jetbrains.plugins.groovy.util.TestUtils; public class JavaToGroovyResolveTest extends GroovyResolveTestCase { @Override protected String getBasePath() { - return TestUtils.getTestDataPath() + "resolve/javaToGroovy/"; + return "${TestUtils.testDataPath}resolve/javaToGroovy/"; } public void testField1() throws Exception { @@ -50,27 +51,39 @@ public class JavaToGroovyResolveTest extends GroovyResolveTestCase { public void testMethod1() throws Exception { PsiJavaReference ref = (PsiJavaReference) configureByFile("method1/A.java"); JavaResolveResult resolveResult = ref.advancedResolve(false); - assertTrue(resolveResult.getElement() instanceof GrMethod); - assertTrue(resolveResult.isValidResult()); + assertTrue(resolveResult.element instanceof GrMethod); + assertTrue(resolveResult.validResult); } public void testScriptMain() throws Exception { PsiJavaReference ref = (PsiJavaReference) configureByFile("scriptMain/A.java"); JavaResolveResult resolveResult = ref.advancedResolve(false); - assertInstanceOf(resolveResult.getElement(), LightMethodBuilder.class); - assertTrue(resolveResult.isValidResult()); + assertInstanceOf(resolveResult.element, LightMethodBuilder.class); + assertTrue(resolveResult.validResult); } public void testScriptMethod() throws Exception { PsiJavaReference ref = (PsiJavaReference) configureByFile("scriptMethod/A.java"); JavaResolveResult resolveResult = ref.advancedResolve(false); - assertTrue(resolveResult.getElement() instanceof GrMethod); - assertTrue(resolveResult.isValidResult()); + assertTrue(resolveResult.element instanceof GrMethod); + assertTrue(resolveResult.validResult); } public void testNoDGM() throws Exception { PsiJavaReference ref = (PsiJavaReference) configureByFile("noDGM/A.java"); - assertNull(ref.advancedResolve(false).getElement()); + assertNull(ref.advancedResolve(false).element); + } + + void testPrivateTopLevelClass() { + myFixture.addFileToProject('Foo.groovy', 'private class Foo{}') + + def ref = configureByText('A.java', ''' +class A { + void foo() { + Object o = new Foo(); + } +}''') + assertNotNull(ref.resolve()) } } \ No newline at end of file diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy index c46e83ef7552..69b237df29b9 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveMethodTest.groovy @@ -299,12 +299,6 @@ public class ResolveMethodTest extends GroovyResolveTestCase { assert ((GrNewExpression) ref.element.parent).advancedResolve().element instanceof PsiMethod } - private PsiReference configureByText(String text) { - myFixture.configureByText 'a.groovy', text - def ref = myFixture.file.findReferenceAt(myFixture.editor.caretModel.offset) - return ref - } - public void testPartiallyDeclaredType() throws Exception { PsiReference ref = configureByFile("partiallyDeclaredType/A.groovy"); PsiElement resolved = ref.resolve(); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolvePropertyTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolvePropertyTest.groovy index 7ed529265f72..98565ef793cc 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolvePropertyTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolvePropertyTest.groovy @@ -659,12 +659,6 @@ setFoo(2) assertInstanceOf resolve("A.groovy"), GrAccessorMethod } - private PsiReference configureByText(String text) { - myFixture.configureByText 'a.groovy', text - def ref = myFixture.file.findReferenceAt(myFixture.editor.caretModel.offset) - return ref - } - public void testJavaLoggingTransform() { myFixture.addClass('package groovy.util.logging; public @interface Log { String value() default ""; }') def ref = configureByText("@groovy.util.logging.Log class Foo { { log.inf } }")