diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GroovyPsiElementFactory.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GroovyPsiElementFactory.java index 1e060609cacb..539be74d9e1b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GroovyPsiElementFactory.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GroovyPsiElementFactory.java @@ -127,7 +127,11 @@ public abstract class GroovyPsiElementFactory implements JVMElementFactory { public abstract GrTopStatement createTopElementFromText(String text); - public abstract GrClosableBlock createClosureFromText(String s) throws IncorrectOperationException; + public abstract GrClosableBlock createClosureFromText(String text, @Nullable PsiElement context); + + public GrClosableBlock createClosureFromText(String s) throws IncorrectOperationException { + return createClosureFromText(s, null); + } public GrParameter createParameter(String name, @Nullable String typeText, @Nullable GroovyPsiElement context) throws IncorrectOperationException { return createParameter(name, typeText, null, context); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrParametersOwner.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrParametersOwner.java index ba5dc90958b9..93321272e8b4 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrParametersOwner.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrParametersOwner.java @@ -29,4 +29,6 @@ public interface GrParametersOwner extends GroovyPsiElement { @Nullable GrParameterList getParameterList(); + + boolean isVarArgs(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/blocks/GrClosableBlock.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/blocks/GrClosableBlock.java index 4038bfc725e3..3ae9a91e9c84 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/blocks/GrClosableBlock.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/blocks/GrClosableBlock.java @@ -48,4 +48,6 @@ public interface GrClosableBlock extends GrExpression, GrCodeBlock, GrParameters @Nullable PsiElement getArrow(); + + boolean isVarArgs(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementFactoryImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementFactoryImpl.java index a0621b1f89e3..60e4c774cb7d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementFactoryImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementFactoryImpl.java @@ -253,8 +253,8 @@ public class GroovyPsiElementFactoryImpl extends GroovyPsiElementFactory { return topStatements[0]; } - public GrClosableBlock createClosureFromText(String closureText) throws IncorrectOperationException { - GroovyFile psiFile = createDummyFile("def foo = " + closureText); + public GrClosableBlock createClosureFromText(String closureText, PsiElement context) throws IncorrectOperationException { + GroovyFile psiFile = createGroovyFile("def foo = " + closureText, false, context); final GrStatement st = psiFile.getStatements()[0]; LOG.assertTrue(st instanceof GrVariableDeclaration, closureText); final GrExpression initializer = ((GrVariableDeclaration)st).getVariables()[0].getInitializerGroovy(); 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 f783ce405d2d..f9c1a0d29b7c 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 @@ -55,6 +55,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrCodeBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.arithmetic.GrAdditiveExpressionImpl; @@ -472,4 +473,8 @@ public class PsiImplUtil { node.replaceChild(oldBodyNode, newBody.getNode()); return newBody; } + + public static boolean isVarArgs(GrParameter[] parameters) { + return parameters.length > 0 && parameters[parameters.length - 1].isVarArgs(); + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrCatchClauseImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrCatchClauseImpl.java index f2f00a55bec1..8ef43c5bde2f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrCatchClauseImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrCatchClauseImpl.java @@ -19,6 +19,7 @@ import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.ResolveState; import com.intellij.psi.scope.PsiScopeProcessor; +import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; @@ -67,4 +68,9 @@ public class GrCatchClauseImpl extends GroovyPsiElementImpl implements GrCatchCl public GrParameterList getParameterList() { return null; } + + @Override + public boolean isVarArgs() { + throw new IncorrectOperationException("Catch clause cannot have varargs"); + } } \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/blocks/GrClosableBlockImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/blocks/GrClosableBlockImpl.java index 1c12a3966956..61fa1f257f46 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/blocks/GrClosableBlockImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/blocks/GrClosableBlockImpl.java @@ -136,6 +136,11 @@ public class GrClosableBlockImpl extends GrBlockImpl implements GrClosableBlock return findPsiChildByType(GroovyTokenTypes.mCLOSABLE_BLOCK_OP); } + @Override + public boolean isVarArgs() { + return PsiImplUtil.isVarArgs(getParameters()); + } + @NotNull public GrParameterListImpl getParameterList() { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/clauses/GrForInClauseImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/clauses/GrForInClauseImpl.java index 63770ef223a4..6e9fb945bcfe 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/clauses/GrForInClauseImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/clauses/GrForInClauseImpl.java @@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.clauses; import com.intellij.lang.ASTNode; +import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; @@ -57,6 +58,11 @@ public class GrForInClauseImpl extends GroovyPsiElementImpl implements GrForInCl return null; } + @Override + public boolean isVarArgs() { + throw new IncorrectOperationException("For in clause cannot have varargs"); + } + @Nullable public GrExpression getIteratedExpression() { return findChildByClass(GrExpression.class); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/clauses/GrTraditionalForClauseImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/clauses/GrTraditionalForClauseImpl.java index 08c8272de811..5e19681aa2f8 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/clauses/GrTraditionalForClauseImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/clauses/GrTraditionalForClauseImpl.java @@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.clauses; import com.intellij.lang.ASTNode; +import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; @@ -118,4 +119,9 @@ public class GrTraditionalForClauseImpl extends GroovyPsiElementImpl implements public GrParameterList getParameterList() { return null; } + + @Override + public boolean isVarArgs() { + throw new IncorrectOperationException("For clause cannot have varargs"); + } } \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodBaseImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodBaseImpl.java index cc1ef7ba8d9d..c3229b0b3c15 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodBaseImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodBaseImpl.java @@ -303,8 +303,7 @@ public abstract class GrMethodBaseImpl extends GrStubElementBase i } public boolean isVarArgs() { - GrParameter[] parameters = getParameters(); - return parameters.length > 0 && parameters[parameters.length - 1].isVarArgs(); + return PsiImplUtil.isVarArgs(getParameters()); } @NotNull diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightParameter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightParameter.java index d2cbc6c4b6e3..b451b3675a18 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightParameter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightParameter.java @@ -15,15 +15,18 @@ */ package org.jetbrains.plugins.groovy.lang.psi.impl.synthetic; +import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiType; -import com.intellij.psi.impl.light.LightParameter; +import com.intellij.psi.impl.light.LightVariableBuilder; +import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyFileType; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; @@ -31,12 +34,33 @@ import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; /** * @author ven */ -public class GrLightParameter extends LightParameter implements GrParameter { +public class GrLightParameter extends LightVariableBuilder implements GrParameter { public static final GrLightParameter[] EMPTY_ARRAY = new GrLightParameter[0]; private volatile boolean myOptional; + private volatile GrModifierList myModifierList; + private PsiElement myScope; public GrLightParameter(@NotNull String name, @NotNull PsiType type, @NotNull PsiElement scope) { - super(name, type, scope, GroovyFileType.GROOVY_LANGUAGE); + super(scope.getManager(), name, type, GroovyFileType.GROOVY_LANGUAGE); + myScope = scope; + myModifierList = new GrLightModifierList(scope, ArrayUtil.EMPTY_STRING_ARRAY); + } + + @NotNull + @Override + public PsiElement getDeclarationScope() { + return myScope; + } + + @Override + public boolean isVarArgs() { + return false; + } + + @NotNull + @Override + public PsiAnnotation[] getAnnotations() { + return PsiAnnotation.EMPTY_ARRAY; } public GrTypeElement getTypeElementGroovy() { @@ -97,4 +121,16 @@ public class GrLightParameter extends LightParameter implements GrParameter { public boolean isValid() { return getDeclarationScope().isValid(); } + + @NotNull + @Override + public GrModifierList getModifierList() { + return myModifierList; + } + + @Override + public GrLightParameter setModifiers(String... modifiers) { + myModifierList = new GrLightModifierList(getContext(), modifiers); + return this; + } }