groovy top level classes cannot have private and protected modifiers

This commit is contained in:
Maxim.Medvedev
2012-01-05 21:32:39 +04:00
parent cb6362db2f
commit 953d14db65
6 changed files with 76 additions and 46 deletions
@@ -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<GrModifierListStub> 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;
}
@@ -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.<error descr="'pack.Foo' is not public in 'pack'. Cannot be accessed from outside package">Foo</error>;
class Abc {
void foo() {
System.out.print(new <error descr="'pack.Foo' is not public in 'pack'. Cannot be accessed from outside package">Foo</error>());
}
}''')
myFixture.testHighlighting(false, false, false)
}
}
@@ -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);
@@ -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 Fo<caret>o();
}
}''')
assertNotNull(ref.resolve())
}
}
@@ -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();
@@ -659,12 +659,6 @@ set<caret>Foo(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 { { lo<caret>g.inf } }")