diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java index 794f1eb25189..d96fe3c2a720 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java @@ -227,6 +227,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr final PsiMethod caller = RefactoringUtil.getEnclosingMethod(ref); if (toChangeArguments) { final PsiExpressionList list = RefactoringUtil.getArgumentListByMethodReference(ref); + LOG.assertTrue(list != null); boolean toInsertDefaultValue = needDefaultValue(changeInfo, caller); if (toInsertDefaultValue && ref instanceof PsiReferenceExpression) { final PsiExpression qualifierExpression = ((PsiReferenceExpression)ref).getQualifierExpression(); diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageSearcher.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageSearcher.java index 9aa7f16d1cfb..bb9ae51d0988 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageSearcher.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageSearcher.java @@ -209,7 +209,7 @@ class JavaChangeSignatureUsageSearcher { if (!isToCatchExceptions) { if (RefactoringUtil.isMethodUsage(element)) { PsiExpressionList list = RefactoringUtil.getArgumentListByMethodReference(element); - if (!method.isVarArgs() && list.getExpressions().length != parameterCount) continue; + if (list == null || !method.isVarArgs() && list.getExpressions().length != parameterCount) continue; } } if (RefactoringUtil.isMethodUsage(element)) { diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantDialog.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantDialog.java index 2155275be5a3..c61a82d31b32 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantDialog.java @@ -46,6 +46,7 @@ import com.intellij.refactoring.util.RefactoringMessageUtil; import com.intellij.ui.RecentsManager; import com.intellij.ui.ReferenceEditorComboWithBrowseButton; import com.intellij.ui.StateRestoringCheckBox; +import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.ui.UIUtil; import gnu.trove.THashSet; @@ -396,6 +397,9 @@ class IntroduceConstantDialog extends DialogWrapper { errorString = RefactoringBundle.message("no.field.name.specified"); } else if (!JavaPsiFacade.getInstance(myProject).getNameHelper().isIdentifier(fieldName)) { errorString = RefactoringMessageUtil.getIncorrectIdentifierMessage(fieldName); + } else if (!myParentClass.getLanguage().equals(newClass.getLanguage())) { + errorString = RefactoringBundle.message("move.to.different.language", UsageViewUtil.getType(myParentClass), + myParentClass.getQualifiedName(), newClass.getQualifiedName()); } if (errorString != null) { CommonRefactoringUtil.showErrorMessage( diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java index 29fafed6a148..4d5e856e148a 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java @@ -60,6 +60,7 @@ public class JavaIntroduceParameterMethodUsagesProcessor implements IntroducePar final PsiElement ref = usage.getElement(); PsiCall callExpression = RefactoringUtil.getCallExpressionByMethodReference(ref); PsiExpressionList argList = RefactoringUtil.getArgumentListByMethodReference(ref); + if (argList == null) return true; PsiExpression[] oldArgs = argList.getExpressions(); final PsiExpression anchor; @@ -261,4 +262,4 @@ public class JavaIntroduceParameterMethodUsagesProcessor implements IntroducePar processChangeMethodUsage(data, new ExternalUsageInfo(((PsiMethodCallExpression)superCall.getExpression()).getMethodExpression()), usages); return false; } -} \ No newline at end of file +} diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java index 46f592b0f222..62a71a3d7752 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.ExpectedTypeInfo; import com.intellij.codeInsight.ExpectedTypesProvider; import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil; import com.intellij.codeInsight.highlighting.HighlightManager; +import com.intellij.lang.StdLanguages; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.RangeMarker; @@ -618,7 +619,9 @@ public class RefactoringUtil { } public static boolean isMethodUsage(PsiElement element) { - if (element instanceof PsiEnumConstant) return true; + if (element instanceof PsiEnumConstant) { + return StdLanguages.JAVA.equals(element.getLanguage()); + } if (!(element instanceof PsiJavaCodeReferenceElement)) return false; PsiElement parent = element.getParent(); if (parent instanceof PsiCall) { @@ -630,6 +633,7 @@ public class RefactoringUtil { return false; } + @Nullable public static PsiExpressionList getArgumentListByMethodReference(PsiElement ref) { if (ref instanceof PsiEnumConstant) return ((PsiEnumConstant)ref).getArgumentList(); PsiElement parent = ref.getParent(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/arguments/GrArgumentList.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/arguments/GrArgumentList.java index 87fe82c282a7..8c6599a14b05 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/arguments/GrArgumentList.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/arguments/GrArgumentList.java @@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiExpressionList; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,7 +29,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.util.GrNamedArgumentsOwner; * @author ilyas * Plain Argumanet list with parentheses. Cannot contain closure arguments, they are placed outside. */ -public interface GrArgumentList extends GroovyPsiElement, GrNamedArgumentsOwner { +public interface GrArgumentList extends GroovyPsiElement, GrNamedArgumentsOwner, PsiExpressionList { @NotNull GrExpression[] getExpressionArguments(); @NotNull PsiElement[] getAllArguments(); @@ -49,4 +50,4 @@ public interface GrArgumentList extends GroovyPsiElement, GrNamedArgumentsOwner GrExpression removeArgument(int argNumber); GrNamedArgument addNamedArgument(GrNamedArgument namedArgument); -} \ No newline at end of file +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/members/GrEnumConstant.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/members/GrEnumConstant.java index c8dc617d7629..9151b4e76d10 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/members/GrEnumConstant.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/members/GrEnumConstant.java @@ -16,22 +16,23 @@ package org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members; -import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; +import com.intellij.psi.PsiEnumConstant; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinitionBody; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrConstructorCall; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; -import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.annotations.NotNull; -import com.intellij.psi.PsiMethod; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrConstructorCall; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinitionBody; /** * @author: Dmitry.Krasilschikov * @date: 06.04.2007 */ -public interface GrEnumConstant extends GrField, GrConstructorCall { +public interface GrEnumConstant extends GrField, GrConstructorCall, PsiEnumConstant { GrEnumConstant[] EMPTY_ARRAY = new GrEnumConstant[0]; + @Nullable GrTypeDefinitionBody getAnonymousBlock(); + + @Override + GrArgumentList getArgumentList(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrArgumentListImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrArgumentListImpl.java index d3d6d082f15f..6e8711f499fb 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrArgumentListImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrArgumentListImpl.java @@ -18,6 +18,8 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.arguments; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiExpression; +import com.intellij.psi.PsiType; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.impl.source.tree.TreeUtil; import com.intellij.util.ArrayUtil; @@ -222,4 +224,16 @@ public class GrArgumentListImpl extends GroovyPsiElementImpl implements GrArgume } super.deleteChildInternal(child); } + + @NotNull + @Override + public PsiExpression[] getExpressions() { + return PsiExpression.EMPTY_ARRAY; + } + + @NotNull + @Override + public PsiType[] getExpressionTypes() { + return PsiType.EMPTY_ARRAY; + } } \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/enumConstant/GrEnumConstantImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/enumConstant/GrEnumConstantImpl.java index 5f34461a15cd..e7b8011160cf 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/enumConstant/GrEnumConstantImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/enumConstant/GrEnumConstantImpl.java @@ -26,6 +26,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument; @@ -110,6 +111,7 @@ public class GrEnumConstantImpl extends GrFieldImpl implements GrEnumConstant, P private GroovyResolveResult[] multiResolveConstructorImpl(boolean allVariants) { PsiType[] argTypes = PsiUtil.getArgumentTypes(getFirstChild(), false); PsiClass clazz = getContainingClass(); + assert clazz != null; PsiType thisType = JavaPsiFacade.getInstance(getProject()).getElementFactory().createType(clazz, PsiSubstitutor.EMPTY); MethodResolverProcessor processor = new MethodResolverProcessor(clazz.getName(), this, true, thisType, argTypes, PsiType.EMPTY_ARRAY, allVariants); @@ -128,13 +130,25 @@ public class GrEnumConstantImpl extends GrFieldImpl implements GrEnumConstant, P return findChildByClass(GrArgumentList.class); } + @Override + public PsiEnumConstantInitializer getInitializingClass() { + return null; + } + public GrExpression removeArgument(final int number) { final GrArgumentList list = getArgumentList(); return list != null ? list.removeArgument(number) : null; } public GrNamedArgument addNamedArgument(final GrNamedArgument namedArgument) throws IncorrectOperationException { - return null; + GrArgumentList list = getArgumentList(); + assert list != null; + if (list.getText().trim().length() == 0) { + final GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(getProject()); + final GrArgumentList newList = factory.createArgumentList(); + list = (GrArgumentList)list.replace(newList); + } + return list.addNamedArgument(namedArgument); } @Override @@ -167,6 +181,13 @@ public class GrEnumConstantImpl extends GrFieldImpl implements GrEnumConstant, P return PsiImplUtil.extractUniqueElement(multiResolveConstructor()); } + @NotNull + @Override + public JavaResolveResult resolveMethodGenerics() { + return JavaResolveResult.EMPTY; + } + + @Nullable public GrTypeDefinitionBody getAnonymousBlock() { return findChildByClass(GrTypeDefinitionBody.class); } @@ -224,4 +245,9 @@ public class GrEnumConstantImpl extends GrFieldImpl implements GrEnumConstant, P public boolean isSoft() { return false; } + + @Override + public PsiMethod resolveConstructor() { + return resolveMethod(); + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java index 4b91a7797960..dd9f84712b30 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java @@ -176,6 +176,7 @@ public class PsiUtil { @Nullable public static GrArgumentList getArgumentsList(PsiElement methodRef) { + if (methodRef instanceof GrEnumConstant) return ((GrEnumConstant)methodRef).getArgumentList(); PsiElement parent = methodRef.getParent(); if (parent instanceof GrCall) { return ((GrCall)parent).getArgumentList(); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java index ced93ecfc6cb..f760de060c87 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java @@ -309,12 +309,17 @@ public class GroovyHighlightingTest extends LightCodeInsightFixtureTestCase { public void testWrongAnnotation() {doTest();} public void testAmbiguousMethods() { - myFixture.copyFileToProject(getTestName(false)+".java"); + myFixture.copyFileToProject(getTestName(false) + ".java"); doTest(); } public void testMapParamWithNoArgs() {doTest(new GroovyAssignabilityCheckInspection());} + public void testGroovyEnumInJavaFile() { + myFixture.copyFileToProject(getTestName(false)+".groovy"); + myFixture.testHighlighting(true, false, false, getTestName(false) + ".java"); + } + public void testRangeType() { doTest(new GroovyRangeTypeCheckInspection()); } diff --git a/plugins/groovy/testdata/highlighting/GroovyEnumInJavaFile.groovy b/plugins/groovy/testdata/highlighting/GroovyEnumInJavaFile.groovy new file mode 100644 index 000000000000..547a2395f503 --- /dev/null +++ b/plugins/groovy/testdata/highlighting/GroovyEnumInJavaFile.groovy @@ -0,0 +1,3 @@ +enum MyEnum { + E1, E2, E3 +} diff --git a/plugins/groovy/testdata/highlighting/GroovyEnumInJavaFile.java b/plugins/groovy/testdata/highlighting/GroovyEnumInJavaFile.java new file mode 100644 index 000000000000..0f80c596ebc5 --- /dev/null +++ b/plugins/groovy/testdata/highlighting/GroovyEnumInJavaFile.java @@ -0,0 +1,13 @@ +class MyJavaClass { + public static void main(String[] args) { + for (MyEnum e : MyEnum.values()) { + switch (e) { + case E1: + System.out.println("E1"); + break; + case E4: + System.out.println("fail"); + } + } + } +}